http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170

参考:

http://blog.csdn.net/cc_again/article/details/24841249

UPDATE:

第二次做的感受,说下这道题为什么用递推。对于这种排序,且连续至多的问题,每个点放什么受到之前那个点是什么的影响,也就是说这个点的情况可以由前面那个点的情况推出来

题目意思:

给n个士兵排队,每个士兵三种G、R、P可选,求至少有m个连续G士兵,最多有k个连续R士兵的排列的种数。

一个最多,一个最少很难判断。可以转化成两个最多。

至少有m个 =  取值 m~n =  {最多有n个} - {最多有m-1个}

因为是求总情况个数,第n个的情况可以从第n-1个的情况推出,所以可以用递推。

然后就是状态方程:

第i个的情况,至少有u个G,k个R

dp[i][0] 表示 G

dp[i][1] 表示 R

dp[i][2] 表示 P

当第i个为P时      前面没有任何限制条件, dp[i][2] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]

当第i个为G时

若 i<=u                   没有任何限制,      dp[i][0] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]

若 i=u+1      需要减去前u个都是G的情况,dp[i][0] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]-1

若i>u+1      需要减去(i-1)~(i-u)个连续G的情况,dp[i][0] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2]-dp[i-u-1][1]-dp[i-u-1][2]

当第i个为R时    同G

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
using namespace std;#define MEM(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define debug printf("!/m")
#define INF 1100000
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define M 1000000007LL dp[INF][5];
LL n,m,k,u,v;LL Cal()
{dp[0][0] = 1;//初始化时可以随意放一个,没有什么影响,因为后面已经把所有情况考虑进去dp[0][1] = 0;dp[0][2] = 0;int i;for(i = 1;i<=n;i++){LL sum = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2])%M;dp[i][2]=sum;if(i<=u)dp[i][0] = sum;else if(i==u+1)dp[i][0] = (sum-1)%M;elsedp[i][0] = (sum - dp[i-u-1][1] - dp[i-u-1][2])%M;if(i<=v)dp[i][1] = sum;else if(i==v+1)dp[i][1] = (sum - 1)%M;elsedp[i][1] = (sum - dp[i-v-1][0] - dp[i-v-1][2])%M;}return (dp[n][0]+dp[n][1]+dp[n][2])%M;
}int main()
{while(~sf("%lld%lld%lld",&n,&m,&k)){u = n;v = k;LL ans = Cal();u = m-1;v = k;ans = ((ans - Cal())%M+M)%M;pf("%lld\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/qlky/p/5022649.html

zoj 3747 (DP)(连续至多,连续至少)相关推荐

  1. 【总结】背包问题的至多/恰好/至少

    对于一维背包问题,注意区分该问题的下面这三种情况,即至多/恰好/至少,它们的状态转移方程其实是一样的,差异在于初始化. (1) 体积至多是v时的最小/大值 全部初始化为0,且保证v大于等于0. 代表题 ...

  2. 可导一定连续,连续不一定可导

    今天在群里面看到大家发了这句可导一定连续,连续不一定可导..大家应该都很熟悉,包括我自己,但是真正理解有多少呢,我当时就没想明白,中午吃饭的时候也在想,最后还是想明白了,特将数学推导放在这里:

  3. 023 导数之左导数、右导数;可导必然连续,连续不一定可导

    023 导数之左导数.右导数:可导必然连续,连续不一定可导

  4. ZOJ 3747 Attack on Titans

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3747 题意: 现在有n个士兵进行排序,只有G.R.P三种士兵,要求至少有m ...

  5. 计算机系统是连续系统,连续系统的计算机模拟

    连续系统的计算机模拟 (36页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.9 积分  第2章 连续系统的计算机模拟本章讨论连续系统的模拟技术,由 ...

  6. mysql5.7查询连续登录/连续签到天数

    1.DDL CREATE TABLE `user_sign_record` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键i ...

  7. 如何统计连续(连续登陆天数,连续学习天数,连续购买天数)

    直接来看实战,现在有一张表t,这张表存储了每个员工每天的打卡情况,现在需要统计截止目前每个员工的连续打卡天数,表t如下表所示: uid    tdate    is_flag 1    2020/2/ ...

  8. ZOJ 3735 dp

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3735 好久没做DP题了,一开始没理解题目里的C(M,3)是干什么,原来就是 ...

  9. 第二个虫,可连续下载连续文件

    下载文件到本地 import os import requests def DownloadFile(mp3_url, save_url,file_name): try: if mp3_url is ...

最新文章

  1. phpmyadmin 忘记密码重设password
  2. python调用数据库存储过程_python连接mysql调用存储过程示例
  3. R:在Ubuntu14.04 安装R
  4. 数字图像处理之边缘检测,图像分割
  5. es6 babel转码器使用
  6. 数据库-in子句-exists子句
  7. 使用 iPerf 测试 Azure VM 之间的网速
  8. Spark之GraphX
  9. 初学Java,第一段代码
  10. win10专业版开机画面模糊_Win10系统登录背景变模糊的两种恢复方法
  11. The Most Important Skill for Software Architects
  12. Springboot实现filter拦截token验证和跨域
  13. 关于Asp.Net中的返回的操作
  14. Delphi7--Delphi7软件的介绍
  15. 发几个flashxp注册码
  16. 手摸手带你 App 爬虫入门
  17. 空降领导(CTO/技术总监)如何安全落地
  18. android 辅助功能(无障碍)
  19. 第十一届中国云计算标准和应用大会 | 华云数据成为全国信标委云计算标准工作组云迁移专题组副组长单位副组长单位
  20. win7如何看计算机几核,win7系统查看CPU是几核的操作方法

热门文章

  1. SpringMVC学习系列(8) 之 国际化
  2. cloudera manager 及CDH卸载
  3. 不会出现这样的情况吧
  4. C语言嵌入式系统编程修炼之四:屏幕操作
  5. 【AWSL】之Linux磁盘管理与文件系统(fdisk、df、mount、umount、lsblk)
  6. 怎么在云服务器上建网站_云服务器怎么做安全维护
  7. endnote 参考文献加序号_EndNote在Word中插入文献不能自动生成编号 - 解决方案
  8. android多语言编码格式,在Android中使用国家/地区代码以编程方式更改语言
  9. linux如何修改网卡序号,CentOS双网卡时改变网卡编号和配置静态路由的方法
  10. 深入解析 Dubbo 3.0 服务端暴露全流程