蓝桥:夺宝奇兵(动态规划)

夺宝奇兵(动态规划)

[题⽬描述]
  在⼀座⼭上,有很多很多珠宝,它们散落在⼭底通往⼭顶的每条道路上,不同道路上的珠宝的数⽬也 各不相同.
下图为⼀张藏宝地图:
  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;
}


发布了736 篇原创文章 · 获赞 123 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/S_999999/article/details/103392202