1. 程式人生 > >藍橋杯 ADV-62演算法提高 奪寶奇兵(動態規劃)

藍橋杯 ADV-62演算法提高 奪寶奇兵(動態規劃)

[題目描述]
  在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖:

  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;
}