http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3747

题意:

现在有n个士兵进行排序,只有G、R、P三种士兵,要求至少有m个G士兵连续和至多k个R士兵连续,问可以有多少种排法。

思路:

由于题目中一个是至少,另一个是至多,所以先把至少改成至多:(至多有n个G士兵连续,k个R士兵连续)-(至多有m-1个士兵连续,k个士兵连续),这样一来,剩下的情况当中G士兵的个数就是【m,n】,满足至少有m个G士兵连续。

d【i】【j】表示当前第i个人是j号兵种时的方法数。(G:0 ; R:1 ; P:2)

由于当前方法数需要根据上一步推出来,那么上一步的方法数为sum=d【i-1】【0】+d【i-1】【1】+d【i-1】【2】。

①第i个人是P号兵种:

这就很简单了,因为P兵种没有限制,所以直接d【i】【2】=sum。

②第i个人是G号兵种:  (u表示至多有u个G士兵连续)

1)、如果i<=u,那么此时不可能出现u个G连续的情况,直接d【i】【1】=sum。

2)、如果i=u+1,那么此时就会有前i个都为G的情况,而且只有这么一种情况,所以d【i】【1】=sum-1。

3)、如果i>u+1,此时i-u~i-1就会出现都为G的情况,那么此时第i-u-1位就可以为R士兵和P士兵,所以d【i】【1】=sum-d【i-u-1】【1】-d【i-u-1】【2】。

③第i个是R号兵种:

同理分析即可。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<sstream>
 6 #include<vector>
 7 #include<stack>
 8 #include<queue>
 9 #include<cmath>
10 #include<map>
11 #include<set>
12 using namespace std;
13 typedef long long ll;
14 typedef pair<int,int> pll;
15 const int INF = 0x3f3f3f3f;
16 const int maxn = 1000000 + 5;
17
18 const int mod=1000000007;
19
20 int n,m,k;
21 ll d[maxn][4];
22
23 ll compute(ll u, ll v)
24 {
25     d[0][0]=1;
26     d[0][1]=d[0][2]=0;
27     for(int i=1;i<=n;i++)
28     {
29         ll sum = (d[i-1][0]+d[i-1][1]+d[i-1][2])%mod;
30
31         //如果第i位是P
32         d[i][2]=sum;
33
34         //如果第i位是G
35         if(i<=u)
36             d[i][0]=sum;
37         else if(i==u+1)
38             d[i][0]=sum-1;
39         else
40             d[i][0]=sum-d[i-u-1][1]-d[i-u-1][2];
41
42         //如果第i位是R
43         if(i<=v)
44             d[i][1]=sum;
45         else if(i==v+1)
46             d[i][1]=sum-1;
47         else d[i][1]=sum-d[i-v-1][0]-d[i-v-1][2];
48     }
49     return (d[n][0]+d[n][1]+d[n][2])%mod;
50 }
51
52 int main()
53 {
54     //freopen("in.txt","r",stdin);
55     while(scanf("%d%d%d",&n,&m,&k)!=EOF)
56     {
57         printf("%lld\n",((compute(n,k)-compute(m-1,k))%mod+mod)%mod);
58     }
59     return 0;
60 }

转载于:https://www.cnblogs.com/zyb993963526/p/7203833.html

ZOJ 3747 Attack on Titans相关推荐

  1. ZOJ 2849 Attack of Panda Virus (优先队列 priority_queue)

    优先队列,据说标程是并查集,没思路.貌似优先队列都是直接用stl写的,又逼我用stl了.prioriry_queue不熟. ps: value值越小,优先级越高.所以重载 < 运算符时按优先级从 ...

  2. zoj 3747 (DP)(连续至多,连续至少)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170 参考: http://blog.csdn.net/cc_again/ar ...

  3. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  4. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  5. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  6. 《动态规划》— 动态规划分类

    动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...

  7. 递推DP(至少和至多之间的转换

    UVa 10328 - Coin Toss 题意:给你一个硬币,抛掷n次,问出现连续至少k个正面向上的情况有多少种. 转换成抛N次至多连续有N个减去抛N次至多连续有K-1个1的情况 dp[i][k]表 ...

  8. 转:动态规划题目分类

    https://blog.csdn.net/cc_again/article/details/25866971 一.简单基础dp 这类dp主要是一些状态比较容易表示,转移方程比较好想,问题比较基本常见 ...

  9. 【DP专辑】ACM动态规划总结

    转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 ...

最新文章

  1. IOS网址解析-demo
  2. vsftpd Problem with 425 Security: Bad IP connecting 解决
  3. (问题)c语言现代方法2th,自己编写的reminder.c程序 找错/修改/拓展延伸
  4. Android开发经验实战总结
  5. 8-python自动化-day08-进程、线程、协程篇
  6. tomcat安全认证
  7. 聊天软件项目TCP升级版
  8. css3特效-传送带示例
  9. GNU make manual 翻译(三)
  10. aiml简介+源代码解析+中文分词(java)
  11. JPA自动生成数据库表教程
  12. Axure原型设计灯箱效果
  13. mediasoup安装使用
  14. oracle用户授权只读,只读权限oracle用户
  15. 【QCM2150】WFA 11ac 4.2.43测试失败及解决方案
  16. MAVROS的plugin到底是什么意思?plugin中文意思是插件
  17. 全球及中国TNFα抑制剂行业竞争调查分析及项目可行性研究报告2021-2027年
  18. 黑马电商项目初始化学习笔记
  19. ip网络广播系统服务器,IP网络广播系统控制软件
  20. hmmbuild结果文件解读:hmm文件

热门文章

  1. arduino读取matlab串口,Matlab Arduino实时串行通信,采样0.004 s
  2. ios 构建版本一直在处理中_iOS -打包上传成功,在构建版本一直刷不出来
  3. java中的static关键字总结
  4. python3.x版本的保留字总数是多少_Python3.6.5版本的保留字总数是:()-智慧树大数据分析的python基础章节答案...
  5. Kittle工具抽取文件出现乱码的情况解决方法
  6. spark用scala读取hive表数据(不同版本区别)
  7. sarscape 将dem文件转化成stl_STL源码剖析 阅读笔记(一)介绍
  8. mysql字符串逆时针旋转180度_mysql 函数示例(转)
  9. 个人计算机使用的标准键盘,计算机键盘的基本用法!
  10. html怎么建立段落,HTML 段落