寒假训练报告1.24(计数DP)
2018-01-24 15:34
239 查看
将n个无区别的物品,划分成不超过m组,求划分方法数模M的余数
这样的划分称为n的m划分
dp[i][j] = j的i划分的总数
dp[i][j] = dp[i][j-i] + dp[i-1][j]
这个递推式可以不重复地计算所有的划分,复杂度为O(nm)
多重集组合数
n种物品,第i个物品有ai个。不同种类物品可以互相区分,相同种类物品无法区分。从这些物品中取出m个,有多少种取法?
dp[i+1][j] = dp[i+1][j-1] + dp[i][j] - dp[i][j-1-ai]
复杂度为O(nm)
这样的划分称为n的m划分
dp[i][j] = j的i划分的总数
dp[i][j] = dp[i][j-i] + dp[i-1][j]
这个递推式可以不重复地计算所有的划分,复杂度为O(nm)
int dp[maxn][maxn]; void solve(){ dp[0][0] = 1; for(int i = 1; i <= m; i++){ for(int j = 0; j <= n; j++){ if(j - i >= 0) dp[i][j] = (dp[i-1][j] + dp[i][j-i]) % M; else dp[i][j] = dp[i-1][j]; } } cout << dp[m] << endl; }
多重集组合数
n种物品,第i个物品有ai个。不同种类物品可以互相区分,相同种类物品无法区分。从这些物品中取出m个,有多少种取法?
dp[i+1][j] = dp[i+1][j-1] + dp[i][j] - dp[i][j-1-ai]
复杂度为O(nm)
int a[maxn]; int dp[maxn][maxn]; void solve(){ for(int i = 0; i <= n; i++) dp[i][0] = 1; for(int i = 0; i < n; i++){ for(int j = 1; j <= m; j++){ if(j - 1 - a[i] >= 0) dp[i+1][j] = (dp[i+1][j-1] + dp[i][j] - dp[i][j-1-a[i]] + M) % M; else dp[i+1][j] = (dp[i+1][j-1] + dp[i][j]) % M; } } cout << dp [m] << endl; }
相关文章推荐
- 寒假训练报告1.30(LIS和LCS转换)
- 寒假训练5解题报告
- 寒假训练报告1.15(搜索进阶)
- 寒假训练2018.2.3--2.5训练日志------dp学习
- 常州大学新生寒假训练会试-D-训练技巧(DP+单调队列)
- hdu 4901 The Romantic Hero(计数dp)2014多校训练第4场1005
- 寒假训练报告1.29(最短路)
- 寒假训练报告2.9(常用技巧)
- hdu 4901 The Romantic Hero(计数dp)2014多校训练第4场1005
- 寒假训练报告1.19(基础动态规划)
- 寒假训练报告1.31(最小生成树)
- 寒假训练1解题报告
- 寒假训练3解题报告 CodeForces #148
- hdu 4901 The Romantic Hero(计数dp)2014多校训练第4场1005
- 寒假训练DP
- 寒假训练2解题报告
- BZOJ 3193 [JLOI 2013] 计数DP 解题报告
- 寒假训练报告2.2(数论基础)
- 寒假训练4解题报告
- 寒假训练报告1.18(贪心)