POJ3014 Cake Pieces and Plates DP
2013-05-23 18:03
405 查看
虽说是DP入门题,但第一次要理解还是会花很大的劲。
dp[i][j]表示j块蛋糕放在i个盘子上的方法数,可有盘子是空的。
①若i==j
当盘子有空,问题可转化为dp[i-1][j] (i-1保证了至少有一个盘子是空);
当盘子全满,只有一种情况,就是每个盘子放一块蛋糕;
②若i>j
当盘子有空,问题转化为dp[i-1][j];
不存在盘子满的状态;
③若i<j
当盘子有空,问题转化为dp[i-1][j]
当盘子全满,每个盘子放一个蛋糕保证盘子全满,然后问题转化为j-i块蛋糕放入i个盘子的问题,即dp[i][j-i]。
dp[i][j]表示j块蛋糕放在i个盘子上的方法数,可有盘子是空的。
①若i==j
当盘子有空,问题可转化为dp[i-1][j] (i-1保证了至少有一个盘子是空);
当盘子全满,只有一种情况,就是每个盘子放一块蛋糕;
②若i>j
当盘子有空,问题转化为dp[i-1][j];
不存在盘子满的状态;
③若i<j
当盘子有空,问题转化为dp[i-1][j]
当盘子全满,每个盘子放一个蛋糕保证盘子全满,然后问题转化为j-i块蛋糕放入i个盘子的问题,即dp[i][j-i]。
#include <iostream> using namespace std; #define N 4505 int dp ; int main() { int n, m; scanf("%d%d",&n,&m); for(int i=0; i<=m; i++) dp[1][i] = 1; for(int i=2; i<=n; i++) for(int j=1; j<=m; j++) { if(i==j) dp[i][j] = dp[i-1][j] + 1; else if(i<j) dp[i][j] = dp[i-1][j] + dp[i][j-i]; else dp[i][j] = dp[i-1][j]; if(dp[i][j]>1000000007) dp[i][j]-=1000000007; } printf("%d\n",dp [m]); return 0; }
相关文章推荐
- POJ3014 Cake Pieces and Plates (整数划DP)
- hdu1028 poj1644放苹果poj3014 Cake Pieces and Plates----整数划分模板
- poj 3014 Cake Pieces and Plates 分蛋糕(dp)
- poj 3014 Cake Pieces and Plates 整数拆分
- POJ 3014 Cake Pieces and Plates 可能会
- ACM程序设计选修课——1040: Alex and Asd fight for two pieces of cake(YY+GCD)
- codeforces #334 D. Babaei and Birthday Cake (线段树或者dp+二分)
- Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp
- Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake(线段树+离散化优化DP)
- Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake(dp + BIT)
- codeforces 629 D. Babaei and Birthday Cake dp + 线段树
- Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake (复杂的DP)
- codeforces 629D-Babaei and Birthday Cake(dp && 线段树或树状数组离散优化)
- B. Shaass and Bookshelf DP
- HDU1078 - FatMouse and Cheese(记忆化搜索+dp思想)
- Codeforces Round #396 (Div. 2) C. Mahmoud and a Message 倒着DP
- CodeForces 314B - Sereja and Periods 很有思维的DP
- Codeforces Round #343 (Div. 2) C. Famil Door and Brackets dp
- SGU495_Kids and Prizes_概率DP
- HDU 1069 Monkey and Banana (经典dp)详解及易错点分析