zoj 3747 Attack on Titans 递推 计数dp
来源:互联网 发布:知乎周刊plus epub 编辑:程序博客网 时间:2024/06/03 04:54
题意:给定三种士兵G,R,P,有无限个,要求取出一个排列为n人,要求满足至少m个连续个G士兵,至多k个连续的R士兵,P士兵不作要求。求排列总数,对1000000007取模。
思路:http://blog.csdn.net/cc_again/article/details/10858813。不是很懂取模什么意思
#include<cstdio>#include<cstdlib>#include<time.h>#define ll long longconst int maxn = 1000000+10;//至少m个G 至多k个R p任意 const int mod=1000000007;ll dp[maxn][3];//[0]表示第i个为G,[1]表示R [2] 表示p int n,m,k;int solve(int u,int r)//代表G至多u个, R至多r个 {for(int i=1;i<=n;i++){ll sum= (dp[i-1][0]+dp[i-1][1]+dp[i-1][2])%mod;//中间结果用ll存,否则溢出 dp[i][2]=sum;if(i<=u)dp[i][0]=sum;else if(i==u+1)dp[i][0]=(sum-1)%mod;else if(i>u+1)dp[i][0]=(sum-dp[i-u-1][1]-dp[i-u-1][2])%mod;if(i<=r)dp[i][1]=sum;else if(i==r+1)dp[i][1]=(sum-1)%mod;else if(i>r+1)dp[i][1]=(sum-dp[i-r-1][0]-dp[i-r-1][2])%mod;}return (dp[n][0]+dp[n][1]+dp[n][2])%mod;}int main(){//freopen("in.txt","r",stdin);while(scanf("%d%d%d",&n,&m,&k)!=EOF){dp[0][0]=1;dp[0][1]=dp[0][2]=0;int ans=((solve(n,k)-solve(m-1,k))%mod+mod)%mod;printf("%d\n",ans);}}
阅读全文
0 0
- zoj 3747 Attack on Titans 递推 计数dp
- ZOJ 3747 Attack on Titans【带限制条件的递推dp+计数技巧】
- zoj 3747 Attack on Titans 带限制条件的计数递推dp
- [递推dp] zoj 3747 Attack on Titans
- dp递推 zoj 3747 Attack on Titans
- ZOJ 3747 Attack on Titans(动态规划(DP) 递推)
- ZOJ 3747 Attack on Titans(DP)
- Attack on Titans ZOJ - 3747 DP
- [ZOJ 3747] Attack on Titans (计数DP + 连续至多 + 连续至少)
- ZOJ 3747 Attack on Titans
- ZOJ 3747 Attack on Titans
- ZOJ 3747 Attack on Titans
- Attack on Titans ZOJ 3747
- Attack on Titans(递推dp 条件限制)
- ZOJ 题目3747 Attack on Titans(DP)
- 【zoj】【Attack on Titans】
- Attack on Titans ZOJ
- Attack on Titans ZOJ
- spring + redis + org.springframework.beans.factory.UnsatisfiedDependencyException:
- hbase的常用shell操作
- Python 函数中,参数是传值,还是传引用?
- XP系统还不过时 教你完美征服3TB硬盘
- Linux学习笔记三
- zoj 3747 Attack on Titans 递推 计数dp
- WINDOWS是如何在注册表里记录盘符分配的
- JS使用正则+JSON对HTML模板进行数据填充
- struts2_part02
- http://bbs.csdn.net/topics/390759060
- jdbc 22
- log4j 产生的日志位置设置 和 catalina.home、catalina.base
- 完成端口与高性能服务器程序开发
- Scanner类 Scanner类输入数字,字母,字符串