zoj 3747 排列组合dp
来源:互联网 发布:mysql主键从1000开始 编辑:程序博客网 时间:2024/06/08 00:49
排列组合dp
题意:
现在要挑选n个士兵成为一个排列,从三个不同的军团之中,第一个军团最少u个人连续站在一起,第二个军团最多有v个士兵站在一起,问有多少种不同的挑选方式。
思路:
对于最多和最少问问题尽量转化为最多的问题,比如第一个军团的限制条件,那么在求的时候转化为最多有i个人。
排列组合计数问题很容易从前一个状态推到当前的状态,定义:
- 解决的办法是判断当前有多少人,减去不满足条件的即可。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 1000000+10;const int mod = 1000000007;long long dp[maxn][3];int n;long long solve(int u,int v){ dp[0][0] = 1; dp[0][1] = 0; dp[0][2] = 0; for(int i = 1;i <= n; i++) { long long sum = (dp[i-1][0] + dp[i-1][1] + dp[i-1][2])%mod; dp[i][2] = sum; if(i <= u) dp[i][0] = sum; else if(i == u+1) dp[i][0] = (sum-1)%mod; else dp[i][0] = (sum - dp[i-u-1][1] - dp[i-u-1][2])%mod; if(i <= v) dp[i][1] = sum; else if(i == v + 1) dp[i][1] = (sum - 1)%mod; else dp[i][1] = (sum - dp[i-v-1][0] - dp[i-v-1][2])%mod; } return (dp[n][0]+dp[n][1]+dp[n][2])%mod;}int main(){// freopen("in.txt","r",stdin); int u,v; while(scanf("%d%d%d",&n,&u,&v) != EOF) { long long ans = solve(n,v); ans = ((ans-solve(u-1,v))%mod+mod)%mod; printf("%I64d\n",ans); } return 0;}
阅读全文
0 0
- zoj 3747 排列组合dp
- zoj 3725 dp求排列组合数
- ZOJ-3557(排列组合 + lucas)
- hdu 5155(DP+排列组合)
- 【HDU】 4832 Chess 排列组合 DP
- hdu 5151区间dp+排列组合
- hdu5396 Expression 区间dp +排列组合
- poj 1850 数位dp/排列组合
- HDU 4055 计数dp + 排列组合
- ZOJ 3747 Attack on Titans(DP)
- Attack on Titans ZOJ - 3747 DP
- UVA 10328 , ZOJ 3747 (DP 递推)
- HDU 1799 循环多少次?(排列组合,dp)
- Painting Storages(zju5048,DP+排列组合)
- 排列组合(二) - HDU 1436 dp
- fjnu2013校赛E(数位dp,排列组合)
- HDU--5396(区间dp+排列组合)
- HDU 5396 Expression(区间DP,排列组合)
- 双鸭山大学
- Node
- 网络编程之编写LSP进行Winsock API监控拦截或LSP注入
- 《Effective Java》(7~8)阅读笔记
- java学习旅程
- zoj 3747 排列组合dp
- HTML5速查
- 从机器学习到深度学习
- ubuntu升级步骤
- App Extensions篇之Share Extension
- python3+关于HTMLTestRunner报告里面出现2次错误提示的问题
- iOS并发(多线程)
- 1075. 链表元素分类(25)
- 身份证的校验码计算