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