题目描述
在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同。
下图为一张藏宝地图:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?
在上图所示例子中,按照 5-> 7-> 8-> 3-> 7 的顺序,将得到最大值 30
输入格式
第一行正整数 N,表示山的高度
接下来有 N 行非负整数,第 i 行有 i 个整数,表示山的第 i 层上从左到右每条路上的珠宝数目
输出格式
一个整数,表示从山底到山顶的所能得到的珠宝的最大数目.
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
数据范围
1 ≤ N ≤ 100
题解
动态规划:
f[i][j]
:
集合
:所有从(1,1)走到(i,j)的方案的集合。属性
:最大值(珠宝数量)
#include <iostream>
using namespace std;
const int N = 110;
int g[N][N], f[N][N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= i; j ++)
cin >> g[i][j];
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= i; j ++)
f[i][j] = max(f[i - 1][j], f[i - 1][j - 1]) + g[i][j];
int ans = 0;
for (int i = 1; i <= n; i ++) ans = max(ans, f[n][i]);
cout << ans << endl;
return 0;
}