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竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. * ...
随机推荐
- net 中的一些知识
这是一篇摘抄的文章 有一些内容对我很有帮助 .有一些内容解释很清晰 所以我拿过来了. 第一遍用了5天时间,第二遍看的时候决定自己复制一份出来于是有了这儿博客. 什么是.NET?什么是.NET Fram ...
- C++ XML 序列化器
http://www.cppblog.com/xlshcn/archive/2007/11/21/cppxmlserializer.html
- ElementUI select
https://blog.csdn.net/qq_33769914/article/details/81738278 https://blog.csdn.net/m0_37972557/article ...
- pta 习题集5-18 打印学生选课清单
假设全校有最多40000名学生和最多2500门课程.现给出每门课的选课学生名单,要求输出每个前来查询的学生的选课清单. 输入格式: 输入的第一行是两个正整数:N(≤≤40000),为前来查询课表的学生 ...
- Quartz学习记录
参考资料: 官方网站 Quartz使用总结
- 使用webmagic搭建一个简单的爬虫
刚刚接触爬虫,听说webmagic很不错,于是就了解了一下. webmagic的是一个无须配置.便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫. 这句话说的真的一点都不假 ...
- 10.numpy基本用法
参考: https://blog.csdn.net/sinat_32547403/article/details/54017551
- Mac/OSX上安装xshell
xshell没有mac版,且不愿意仅为一个程序运行一个虚拟机.怎么办?装上wine个来跑shell吧! 1.安装 WineBottler 过程略(制作.管理windows程序,类似CrossOver) ...
- 感知机PLA算法实现[转载]
转自:https://blog.csdn.net/u010626937/article/details/72896144#commentBox 1.实现原始形式 import numpy as np ...
- MapReduce的几个实现
1.倒排索引的实现 import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.con ...