試題 演算法提高 奪寶奇兵

2021-10-16 22:25:26 字數 1313 閱讀 6430

[題目描述]

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

73 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層上從左到右每條路上的珠寶數目

[輸出]

乙個整數,表示從山底到山頂的所能得到的珠寶的最大數目.

例:輸入:57

3 88 1 0

2 7 4 4

4 5 2 6 5

輸出:30

解題思路:

題目表意不太明確,實則是從上到下只能走對應的下一行和下一行的右邊一列。

若走到第n行所能拿的最大珠寶數:

第一行所拿:7

第二行所拿:15

第三行所拿:18

…即走到每一行的最大珠寶數與走到上一行的最大珠寶數有關係,遞推的思想。

這裡如果用深搜則會執行超時,我們可以構建乙個輔助陣列來幫助我們儲存。

輔助陣列: b[i][j]為最後一步是i,j的情況下,所能帶的最大珠寶量(=上面一行的珠寶量和上面前一列的珠寶量中的最大值)。

我們可以推出來公式:

b[i][j]=a[i][j]+max(b[i-1][j],b[i-1][j-1]);

如樣例的輔助陣列:

710 15

18 16 15

20 25 20 19

24 30 27 26 24

我們可以直接求最後一行的最大珠寶數便能得出正確答案。

#include

using

namespace std;

#include

#include

int a[

101]

[101

],b[

101]

[101

],n,maxsum=-1

;;intmain()

for(i=

1;i<=n;i++

) maxsum=

max(maxsum,b[n]

[i])

;//直接求最後一行的最大珠寶數

printf

("%d"

,maxsum)

;return0;

}

演算法提高 奪寶奇兵

題目描述 在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖 73 8 8 1 0 2 7 4 4 4 5 2 6 5 奪寶奇兵 從山下出發,到達山頂,如何選路才能得到最多的珠寶呢?在上圖所示例子中,按照5 7 8 3 7的順序,將得...

演算法提高 奪寶奇兵

題目描述 在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖 73 8 8 1 0 2 7 4 4 4 5 2 6 5 奪寶奇兵 從山下出發,到達山頂,如何選路才能得到最多的珠寶呢?在上圖所示例子中,按照5 7 8 3 7的順序,將得...

ADV 62演算法提高 奪寶奇兵

演算法提高 奪寶奇兵 題目描述 在一座山上,有很多很多珠寶,它們散落在山底通往山頂的每條道路上,不同道路上的珠寶的數目也各不相同.下圖為一張藏寶地圖 73 8 8 1 0 2 7 4 4 4 5 2 6 5 奪寶奇兵 從山下出發,到達山頂,如何選路才能得到最多的珠寶呢?在上圖所示例子中,按照5 7 ...