poj 3046 Ant Counting
2014-11-30 14:29
351 查看
题意:T种蚂蚁,共计A只,种内没有区别,问含有x只蚂蚁的子集有多少种(x∈[S,B])
分析 :1.类比C[i][j]相当于把每个种类增加到A只;
2.所以可以从类似组合公式的递推下手;
3.dp[i][j] 代表前i种蚂蚁取j只的情况数
4.转移方程可以继续类比,dp[i][j] = dp[i - 1][k](0 <= k <= min(j,num[i - 1])) ,枚举累加前i - 1种物品中拿出k只蚂蚁的种类数;
5.转移时可以用前缀和思想优化
分析 :1.类比C[i][j]相当于把每个种类增加到A只;
2.所以可以从类似组合公式的递推下手;
3.dp[i][j] 代表前i种蚂蚁取j只的情况数
4.转移方程可以继续类比,dp[i][j] = dp[i - 1][k](0 <= k <= min(j,num[i - 1])) ,枚举累加前i - 1种物品中拿出k只蚂蚁的种类数;
5.转移时可以用前缀和思想优化
#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define MAXN 100010 #define MAXM 1010 #define MOD 1000000 int dp[MAXN],num[MAXM],s[MAXN]; int main() { int n,m,b,e,cur; while(scanf("%d%d%d%d",&n,&m,&b,&e) != EOF) { memset(num,0,sizeof(num)); for(int i = 1;i <= m;i++) { scanf("%d",&cur); num[cur]++; } dp[0] = 1; for(int i = 0;i <= m;i++)s[i] = 1; for(int i = 1;i <= n;i++) { for(int j = 1;j <= m;j++) if(j <= num[i])dp[j] = s[j]; else dp[j] = (s[j] - s[j - num[i] - 1] + MOD) % MOD; for(int j = 1;j <= m;j++) s[j] = (s[j - 1] + dp[j]) % MOD; } int ans = 0; for(int i = b;i <= e;i++) ans = (ans + dp[i]) % MOD; printf("%d\n",ans); } }
相关文章推荐
- poj 3046 Ant Counting dp 优化
- 刷题——Ant Counting POJ - 3046
- POJ 3046 Ant Counting dp
- POJ_3046_Ant_Counting_(动态规划,多重集组合数)
- Ant Counting POJ - 3046 多重组合数
- Ant Counting POJ - 3046 多重组合数
- Ant Counting POJ - 3046 多重集组合数
- Ant Counting POJ - 3046 多重组合数
- Ant Counting POJ - 3046 多重组合数
- POJ 3046 Ant Counting——多重集组合数
- Ant Counting POJ - 3046 多重组合数
- Ant Counting POJ - 3046 多重组合数
- Ant Counting POJ - 3046 多重组合数
- Ant Counting POJ - 3046 多重组合数
- Ant Counting POJ-2437
- poj 3046 Ant Counting (dp)
- POJ Space Ant (向量夹角)
- [POJ] 2282 -> The Counting Problem
- POJ 题目3046 Ant Counting(母函数)
- POJ 3046 Ant Counting 简单DP