POJ-1664 放苹果 动态规划思想解组合数学
2013-01-11 13:37
162 查看
该题说明了状态开设的意义一样,但是从哪个方向去理解推倒状态的转移对解题非常关键.该题扣住是否所有的盘子中有空盘子,就得到了一个非常简单且优美的方程.如果从当前盘子的放置状态或者是当前苹果的放置状态来求解状态转移方程就不能写出来.这和题意中的相同盘子,相同苹果有很大的关系.
代码如下:
代码如下:
#include <cstdlib> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int N, M, dp[15][15]; /* M个相同的苹果放到N个相同的盘子里,经典组合数学问题 每个状态有哪些属性呢? 一般的状态就是dp[i][j]表示把题目中的M,N替换成i,j, 那么我们可以得到动态转移方程: dp[i][j] = dp[i][j-1] + dp[i-j][j] 上面这个方程的意思就是说,如果j个盘子中有空盘子的话,那么就转化为dp[i][j-1],否则 如果放东西的话,那么我们就先给这j个盘子各放一个苹果,然后问题就转化为dp[i-j][j] 边界条件要注意, dp[1][k] = 1 dp[k][1] = 1, dp[0][k] = 1; */ void prep() { memset(dp, 0xff, sizeof (dp)); for (int i = 1; i <= 10; ++i) { dp[0][i] = dp[1][i] = dp[i][1] = 1; } for (int i = 1; i <= 10; ++i) { for (int j = 1; j <= 10; ++j) { if (dp[i][j] == -1) { // 说明这个状态还没有进行更新 dp[i][j] = dp[i][j-1]; if (i >= j) { dp[i][j] += dp[i-j][j]; } } } } } int main() { prep(); int T; scanf("%d", &T); while (T--) { scanf("%d %d", &M, &N); printf("%d\n", dp[M] ); } return 0; }
相关文章推荐
- POJ 1664 放苹果 (基础组合dp)
- [APIO 2016] 赛艇 Boat:动态规划、离散化、组合数学和常数优化
- 滑雪 POJ - 1088 记忆化搜索=搜索的形式+动态规划的思想
- POJ 1088 滑雪 ( DFS+动态规划思想 )
- Alphacode (动态规划思想)POJ - 2033 HDU - 1508
- 动态规划入门(四)DP 基本思想 具体实现 经典题目 POJ1160 POJ1037
- 炮兵阵地(poj1185,状态压缩的动态规划)
- poj1664放苹果
- 动态规划的思想来求解字符串分割问题
- 动态规划入门(二)DP 基本思想 具体实现 经典题目 POJ1088 POJ1163 POJ1050
- POJ-1664 放苹果
- poj 1664 放苹果
- POJ 1837 Balance(动态规划之背包问题)
- POJ 1179 Polygon(动态规划:类似环形石子合并)
- POJ 3252 Round Numbers (组合数学/数位dp)
- poj 1664 放苹果_整数拆分
- [poj 3252] Round Numbers 组合数学
- POJ 1085 Code (组合数学 求字符串对应编码)
- poj 1850 code(组合数学)
- 利用数学思想解1/2/5组合问题