题目描述
观察下面的数字金字塔。
写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。
在上面的样例中,从 7→3→8→7→57→3→8→7→5 的路径产生了最大权值。
输入格式
第一个行一个正整数 �r ,表示行的数目。
后面每行为这个数字金字塔特定行包含的整数。
输出格式
单独的一行,包含那个可能得到的最大的和。
输入输出样例
输入 #1复制
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
输出 #1复制
30
说明/提示
【数据范围】
对于 100%100% 的数据,1≤�≤10001≤r≤1000,所有输入在 [0,100][0,100] 范围内。
题目翻译来自NOCOW。
USACO Training Section 1.5
IOI1994 Day1T1
XXXXX分析:
这是一道简单的动态规划题,在草稿纸上算一算就能知道状态转移方程。可以从上往下找,当然从最底层往上推也可以。
状态转移方程://状态转移方程:max(左下方的数,右下方的数) + 现在这个数 (比较简单)
代码:
//动态规划模板题
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1010][1010], dp[1010][1010];
int main() {
cin >> n;
//直角三角形的输入
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cin >> a[i][j];
}
}
//初始化
memset(dp, -1, sizeof(dp));
dp[1][1] = a[1][1];
//动态规划
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
//状态转移方程:max(左下方的数,右下方的数) + 现在这个数
dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + a[i][j];
}
}
//答案
int mx = INT_MIN;
for (int i = 1; i <= n; i++) {
mx = max(mx, dp[n][i]);
}
cout << mx << endl;
return 0;
}
看在你看的这么认真的份上,点个赞再走呗!