ZOJ 3747 Attack on Titans
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号兵种:
同理分析即可。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<sstream>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
const int INF = 0x3f3f3f3f;
const int maxn = + ; const int mod=; int n,m,k;
ll d[maxn][]; ll compute(ll u, ll v)
{
d[][]=;
d[][]=d[][]=;
for(int i=;i<=n;i++)
{
ll sum = (d[i-][]+d[i-][]+d[i-][])%mod; //如果第i位是P
d[i][]=sum; //如果第i位是G
if(i<=u)
d[i][]=sum;
else if(i==u+)
d[i][]=sum-;
else
d[i][]=sum-d[i-u-][]-d[i-u-][]; //如果第i位是R
if(i<=v)
d[i][]=sum;
else if(i==v+)
d[i][]=sum-;
else d[i][]=sum-d[i-v-][]-d[i-v-][];
}
return (d[n][]+d[n][]+d[n][])%mod;
} int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
printf("%lld\n",((compute(n,k)-compute(m-,k))%mod+mod)%mod);
}
return ;
}
ZOJ 3747 Attack on Titans的更多相关文章
- ZOJ 3747 - Attack on Titans (递推)
		
题意:有三个兵种R,G,C,选取N个排成一列,要求G至少有M个连续的,R至多有K个连续的,问有多少种排列方式. 此题与UVa 10328 - Coin Toss非常相似,都是问某个字符连续出现的种数. ...
 - zoj 3747 递推dp
		
Attack on Titans Time Limit: 2 Seconds Memory Limit: 65536 KB Over centuries ago, mankind faced ...
 - attack on titans(动态规划递推,限制条件,至少转至多方法,进击的巨人)
		
题目意思: 给n个士兵排队,每个士兵三种G.R.P可选,求至少有m个连续G士兵,最多有k个连续R士兵的排列的种数. 原题 Attack on Titans Time Limit: 2 Seconds ...
 - zoj 3747 (DP)(连续至多,连续至少)
		
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5170 参考: http://blog.csdn.net/cc_again/ar ...
 - 【转载】ACM总结——dp专辑
		
感谢博主—— http://blog.csdn.net/cc_again?viewmode=list ---------- Accagain 2014年5月15日 动态规划一 ...
 - 【DP专辑】ACM动态规划总结
		
转载请注明出处,谢谢. http://blog.csdn.net/cc_again?viewmode=list ---------- Accagain 2014年5月15日 ...
 - dp专题训练
		
****************************************************************************************** 动态规划 专题训练 ...
 - 【DP专辑】ACM动态规划总结(转)
		
http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强, ...
 - dp有哪些种类
		
dp有哪些种类 一.总结 一句话总结: 二.dp动态规划分类详解 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. * ...
 
随机推荐
- Python的反序列化漏洞
			
最近准备研究一下反序列化漏洞,但是Java代码看不懂,所以先找一个python的看起,毕竟这种漏洞在python.php中一样存在,等研究明白了基本原理后去看java的反序列化漏洞. python反序 ...
 - exports和module.exports区别
			
参考:module.exports与exports的区别.关于exports的总结 exports 和 module.exports 的区别 module.exports是真正的模块接口,而expor ...
 - Cookie的介绍及使用
			
咱们不搞一开始就一大堆理论知识介绍,怕把人讲懵了...... 咱们换一个思维方式——"从现象看本质",先说说我们看到了什么,再从看到的现象中提出问题,最后深入寻找答案. 我们看到的 ...
 - linux下nproc的作用
			
文章来源: http://blog.csdn.net/odailidong/article/details/50561257 nproc是操作系统级别对每个用户创建的进程数的限制,在Linux下运行多 ...
 - 求全局最小割(SW算法)
			
hdu3002 King of Destruction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
 - react 侧栏二级菜单组件
			
侧边栏菜单组件 component 下新建menu文件,menu下建index.jsx和subitem.jsx index.jsx import React, { Component } from ' ...
 - [Gradle] 发布构件到本地仓库
			
配置 需要发布构件的模块 build.gradle 加入如下配置 apply plugin: 'maven-publish' publishing { publications { mavenJava ...
 - postgresql----索引失效
			
什么是索引失效?如果where过滤条件设置不合理,即使索引存在,且where过滤条件中包含索引列,也会导致全表扫描,索引不起作用.什么条件下会导致索引失效呢? 1.任何计算.函数.类型转换 2.!= ...
 - wap启用宏
			
vba for wps office是使用wps的时候开启宏需要的VBA安装包,安装好这个插件就可以开启wps的宏功能了,重新打开WPS Excel,可以看到上面的工具栏中宏选项变成可选的就成功了 1 ...
 - | unauthenticated user  (1130, "Host '127.0.0.1' is not allowed to connect to this MySQL server")
			
mysql> show processlist;+----+----------------------+-----------------+------+---------+------+-- ...