数字三角形_递归_递推(动态规划)
2016-09-14 21:46
411 查看
输入格式:
5 // 三角形行数,下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
三角形的行数大于1小于等于100,数字为 0 – 99。
要求输出最大和,不必给出具体路径。
思路
D(r,j):第r行第j个数字(r,j从1开始算)
MaxSum(r,j):从D(r,j)到底边的各条路径中,最佳路径的数字之和
问题:求MaxSum(1,1)
D(r,j)出发,下一步只能走D(r+1,j)或者D(r+1,j+1)
对于N行的三角形:
递归
改进
每算出一个MaxSum(r,j)就保存起来,下次用到其值的时候直接取用,则可免去重复计算。
记忆递归型动态规划
递推型动态规划
空间优化动态规划
用D的第n行替代maxSum
北大的公开课真心不错,感觉比现在上的算法课好很多(●’◡’●)
5 // 三角形行数,下面是三角形
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
三角形的行数大于1小于等于100,数字为 0 – 99。
要求输出最大和,不必给出具体路径。
思路
D(r,j):第r行第j个数字(r,j从1开始算)
MaxSum(r,j):从D(r,j)到底边的各条路径中,最佳路径的数字之和
问题:求MaxSum(1,1)
D(r,j)出发,下一步只能走D(r+1,j)或者D(r+1,j+1)
对于N行的三角形:
if(r == N) MaxSum(r,j) = D(r,j) else MaxSum(r,j) = Max{ MaxSum(r+1,j), MaxSum(r+1,j+1) } + D(r,j)
递归
#include<iostream> #include<algorithm> #define MAX 101 using namespace std; int D[MAX][MAX]; int n; int MaxSum(int i, int j) { if(i == n) return D[i][j]; int x = MaxSum(i+1,j); int y = MaxSum(i+1,j+1); return max(x,y) + D[i][j]; } int main(){ cin>>n; for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) cin>>D[i][j]; cout<< MaxSum(1,1) <<endl; return 0; }
改进
每算出一个MaxSum(r,j)就保存起来,下次用到其值的时候直接取用,则可免去重复计算。
记忆递归型动态规划
#include<iostream> #include<algorithm> #define MAX 101 using namespace std; int D[MAX][MAX]; int n; int maxSum[MAX][MAX]; int MaxSum(int i, int j) { if(maxSum[i][j] != -1) return maxSum[i][j]; if(i == n) maxSum[i][j] = D[i][j]; else { int x = MaxSum(i+1,j); int y = MaxSum(i+1,j+1); maxSum[i][j] = max(x,y) + D[i][j]; } return maxSum[i][j]; } int main() { cin>>n; for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) { cin>>D[i][j]; maxSum[i][j] = -1; } cout<< MaxSum(1,1) <<endl; return 0; }
30 | ||||
---|---|---|---|---|
23 | 21 | |||
20 | 13 | 10 | ||
7 | 12 | 10 | 10 | |
4 | 5 | 2 | 6 | 5 |
#include<iostream> #include<algorithm> #define MAX 101 using namespace std; int D[MAX][MAX]; int n; int maxSum[MAX][MAX]; int main() { cin>>n; for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) cin>>D[i][j]; for(int i=1; i<=n; i++) maxSum [i] = D [i]; for(int i=n-1; i>=1; i--) for(int j=1; j<=i; j++) maxSum[i][j] = max(maxSum[i+1][j],maxSum[i+1][j+1]) + D[i][j]; cout<<maxSum[1][1]<<endl; }
空间优化动态规划
用D的第n行替代maxSum
#include<iostream> #include<algorithm> #define MAX 101 using namespace std; int D[MAX][MAX]; int n; int *maxSum; int main() { cin>>n; for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) cin>>D[i][j]; maxSum = D ; // maxSum指向第n行 for(int i=n-1; i>=1; i--) for(int j=1; j<=i; j++) maxSum[j] = max(maxSum[j], maxSum[j+1]) + D[i][j]; cout<<maxSum[1]<<endl; return 0; }
北大的公开课真心不错,感觉比现在上的算法课好很多(●’◡’●)
相关文章推荐
- 【动态规划】数字三角形最大和(二)(递推循环)
- 数字三角形——递归、递推、记忆化搜索
- 递归,递推,记忆化搜索,空间优化(数字三角形)
- 普及练习场 递推与递归二分 数字三角形
- 【动态规划】数字三角形最大值(一)(递归)
- 【转】数字三角形-递推-动态规划
- 动态规划 问题之数字三角形(倒序递推)
- 数字三角形 (动态规划与递归)
- 经典算法题:数字三角形寻找最大路径——动态规划和递归调用两种解法
- 三角形问题——(递归,递推,动态规划)
- 基础DP-递推-类数字三角形。
- 算法训练 数字三角形 (动态规划)
- (动态规划)数字三角形问题
- 递归与递推 & 动态规划、递推、贪心和搜索
- POJ_3176_Cow_Bowling_(数字三角形)_(动态规划)
- sdut.acm 2012级《程序设计基础Ⅱ)》_动态规划 数字三角形问题
- hiho#1037 : 数字三角形 (动态规划)
- 动态规划--再论(数字三角形 poj1163)
- hdu 1176 免费馅饼(动态规划 数字三角形问题变形)
- |Tyvj|动态规划|P1044 数字三角形