夺宝奇兵(动态规划)
[题⽬描述]
在⼀座⼭上,有很多很多珠宝,它们散落在⼭底通往⼭顶的每条道路上,不同道路上的珠宝的数⽬也 各不相同.
下图为⼀张藏宝地图:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
”夺宝奇兵”从⼭下出发,到达⼭顶,如何选路才能得到最多的珠宝呢?在上图所示例⼦中,按照5->7- >8->3->7的顺序,将得到最⼤值30
[输⼊]
第⼀⾏正整数N(100>=N>1),表示⼭的⾼度
接下来有N⾏⾮负整数,第i⾏有i个整数(1<=i<=N),表示⼭的第i层上从左到右每条路上的珠宝数⽬ [输出]
⼀个整数,表示从⼭底到⼭顶的所能得到的珠宝的最⼤数⽬.
[样例输⼊]
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
[样例输出]
30
分析:经典的动态规划之数字三⻆形问题~~
将输⼊存储⼊⼆维数组后,从上到下遍历,对于最左边的 ⼀列,等于a[i][j] +=a[i-1][j];对于最右边的⼀
列,a[i][j] +=a[i-1][j-1];对于其他的中间列,等于a[i][j] +=max(a[i-1][j-1], a[i-1][j]);最后看最后⼀⾏的最⼤值是多少,
即可找到这样⼀条最⼤数⽬珠宝的路径 ~
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int a[101][101];
for(int i = 0; i < n; i++) {
for(int j = 0; j <= i; j++) {
cin >> a[i][j];
}
}
int ans = 0;
for(int i = 1; i < n; i++) {
for(int j = 0; j <= i; j++) {
if(j == 0)
a[i][j] += a[i-1][j];
else if(j == i)
a[i][j] += a[i-1][j-1];
else a[i][j] += max(a[i-1][j-1], a[i-1][j]);
}
}
for(int i = 1; i < n; i++) {
ans = ans > a[n-1][i] ? ans : a[n-1][i];
}
cout << ans;
return 0;
}