藍橋杯 ADV-62演算法提高 奪寶奇兵(動態規劃)
阿新 • • 發佈:2019-01-05
[題目描述]
在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖:
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; }