动态规划——POJ1163数字三角形问题
2013-08-26 09:20
155 查看
#include <iostream> using namespace std; const int MaxNum = 100; int Num[MaxNum + 10][MaxNum + 10]; int MaxSum[MaxNum + 10][MaxNum + 10]; int nMaxSum[MaxNum + 10]; int N; int main() { int i; int j; cin >> N; for(i = 0; i < N; ++i) { for(j = 0; j <= i; ++j) cin >> Num[i][j]; } /* //给MaxSum[][]赋初值,赋给最后一行,从下向上计算 for(j = 0; j < N; ++j) { MaxSum[N - 1][j] = Num[N - 1][j]; } //依次存储到各点的最路径和到数组MaxSum[][] for(i = N - 1; 0 < i; --i) { for(j = 0; j <= i; ++j) { if(MaxSum[i][j] > MaxSum[i][j + 1] ) { MaxSum[i - 1][j] = MaxSum[i][j] + Num[i - 1][j]; }else { MaxSum[i - 1][j] = MaxSum[i][j + 1] + Num[i - 1][j]; } } }*/ //用一维数组存储,节省空间,时间复杂度不变 for(j = 0; j < N; ++j) { nMaxSum[j] = Num[N - 1][j]; } for(i = N - 1; 0 < i; --i) { for(j = 0; j <= i; ++j) { if(nMaxSum[j] > nMaxSum[j + 1]) { nMaxSum[j] = nMaxSum[j] + Num[i - 1][j]; }else { nMaxSum[j] = nMaxSum[j + 1] + Num[i - 1][j]; } } } cout << nMaxSum[0] << endl; return 0; }
由递归转化而来的动态规划:
#include <iostream> using namespace std; const int MaxNum = 100; int Sum[MaxNum + 1]; int main() { int i; int j; int N; int nInput; cin >> N; cin >> Sum[0]; for(i = 1; i < N; ++i) { int nTmp = 0;//用于存储Sum[j - 1] for(j = 0; j <= i; ++j) { cin >> nInput; if(Sum[j] > nTmp)//用于判断是去Sum[j]还是Sum[j - 1] { nTmp = Sum[j]; Sum[j] += nInput; }else { nInput += nTmp; nTmp = Sum[j]; Sum[j] = nInput; } } } int nTmpSum = 0; for(i = 0; i < N; ++i) { if(Sum[i] > nTmpSum) nTmpSum = Sum[i]; } cout << nTmpSum << endl; return 0; }
相关文章推荐
- 动态规划:0-1背包问题
- 动态规划---最优二叉搜索树问题
- 浅谈n阶汉诺伊塔问题拓展动态规划求法
- 动态规划1:最大子段和问题到最大子矩阵问题(一):最大子段和问题详谈
- 动态规划求解抛鸡蛋问题(Google某年面试题)
- 动态规划之背包问题(一)
- 分治与动态规划之Burst Balloons问题
- 动态规划——物品无限的背包问题
- 动态规划 矩阵连乘问题
- 动态规划_钢条切割问题
- 动态规划之最长上升自序列问题
- 动态规划之01背包问题(最易理解的讲解)
- 双层动态规划_吃土豆问题
- 双层动态规划_吃土豆问题
- 动态规划问题(一)——原理
- 洛谷 1164——小A点菜(动态规划的背包问题)
- 0/1背包问题动态规划详解
- 动态规划之背包问题(一)
- 动态规划之硬币问题
- 动态规划之0-1背包问题