主要内容 #
- 数字金字塔2
- 求解思路
- 参考代码
1. 数字金字塔 #

5 13 11 8 12 7 26 6 14 15 8 12 7 13 24 11输出样例 86
2. 求解思路 #
在上节课中我们采用从上至下的遍历搜索方式,实际上,从下至上的最大值路径与从下至上的最大值路径相同。这一小节将采用从下至上的遍历方式解决问题。 1. 确定dp数组的含义 dp[i][j]定义状态表示从从第n行找一个点作为起点走到aij的路径的最大数字和。 2. 确定递推公式 根据dp[i][j]的定义,可以推导出递推公式为: 当i=n时,dp[i][j]=aij(因为时最下面一行,起点出发能够得到的数字就是本身); 当i<n时,dp[i][j]=max{dp[i+1][j],dp[i+1][j+1]}+aij。
3. 参考代码 #
#include<iostream> using namespace std; const int maxn = 1010; int n, a[maxn][maxn], dp[maxn][maxn], ans; int main() { cin << n; for (int i = 1; i <= n; i ++) for (int j = 1; j <= i; j ++) cin << a[i][j]; for (int i = n; i >= 1; i --) { for (int j = 1; j <= i; j ++) { if (i == n) dp[i][j] = a[i][j]; else dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + a[i][j]; } } cout << dp[1][1]; return 0; }