给定一个由n行数字组成的数字三角形,如下图所示:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/*5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5*/ //自底向上解决 #include<iostream> using namespace std; #define max(a,b) a>b?a:b int main() { int n; cin>>n; int a[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<=i;j++) cin>>a[i][j]; } //一层一层解答最大值 for(int i=n-2;i>=0;i--){ for(int j=i;j>=0;j--){ a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]); // cout<<a[i][j]<<endl; } } cout<<a[0][0]<<endl; }
自底向上,一层一层的动态规划
给定一个由n行数字组成的数字三角形,如下图所示:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大(每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数)。