動態規劃問題 1)數塔問題

2021-10-08 02:16:02 字數 1690 閱讀 7542

數塔問題:一些數字堆成數塔的形狀,第1層有1個數,第2層有2個數……第n層有n個數。從第一層走到最後一層,每次只能走下一層相鄰的兩個數中的乙個,要求走的路徑上所有數字之和最大是多少。

假設是下面這個數塔:

這個數塔中最大和是30

首先如果用暴力法:每乙個數字都會有兩條路徑,時間複雜度為o(2^n),非常大的複雜度!

用動態規劃來解決:

用乙個陣列f[i][j]來表示第i層第j行的數字,用dp[i][j]來表示第i行第j列數字出發到最底層的最大路徑和。

要知道從第一行第一列7開始到最底層的最大和(dp[1][1])就要知道它的兩條子路徑(左下或者右下)到最底層的最大和,就是兩個子問題1.從位置(2,1)到最底層的最大和dp[2][1];2.從位置(2,2)到最底層的最大和dp[2][2];也就是要知道dp[i][j]就要先知道dp[i+1][j],dp[i+1][j+1],然後選擇其中大的那一條加上f[i][j]。

狀態方程就是

dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+f[i][j]

邊界就是:

dp[n][j]=f[n][j]。

動態規劃的起始就從邊界開始,通過以上這個狀態方程依次推,確定每乙個dp[i][j],直到到達最高層(dp[1][1])。

例題:奪寶奇兵

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

3 88 1 0

2 7 4 4

4 5 2 6 5

」奪寶奇兵」從山下出發,到達山頂,如何選路才能得到最多的珠寶呢?在上圖所示例子中,按照5->7->8->3->7的順序,將得到最大值30。

ps:山底向山頂走,只能走當前位置的正上方和當前位置的左上方。

輸入格式:

第一行正整數n(100>=n>1),表示山的高度

接下來有n行非負整數,第i行有i個整數(1<=i<=n),表示山的第i層上從左到右每條路上的珠寶數目

輸出格式:

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

輸入樣例:

在這裡給出一組輸入。例如:

573

8810

2744

4526

5

輸出樣例:

在這裡給出相應的輸出。例如:

30
這道題就是乙個數塔問題,**實現:

#include

#include

#include

using

namespace std;

intmain()

}for

(int i=

1;i<=n;i++

)for

(int i=n-

1;i>=

1;i--

)//從n-1層依次向上推

} cout << dp[1]

[1];

}

動態規劃 數塔問題

有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?從頂點出發時到底向左走還是向右走應 取決於是從左走能取到最大值還是從右走能取到最大值,只要左右兩道路徑上的最大值求出來了才能作出決策。同樣的道理下一層的走向又要取決於再下一層上的最大值是否已經求出才能...

動態規劃 數塔問題

從上到下出發,每次只能走到下面相鄰的節點,尋找一條路徑使經過的數值和最大。12 15 10 6 8 2 18 9 5 19 7 10 4 15 動態規劃思路 假設到第i行第j個元素為止的最優解為f i j 則f i j 實際上至於f i 1 j 和f i 1 j 1 有關。include inclu...

數塔問題(動態規劃)

設有乙個三角形的數塔,頂點為根結點,每個結點有乙個整數值。從頂點出發,可以向左走或向右走,如圖所示 若要求從根結點開始,請找出一條路徑,使路徑之和最大,只要輸出路徑的和。輸入第一行為n n 10 表示數塔的層數 從第2行至n 1行,每行有若干個資料,表示數塔中的數值。輸出 輸出路徑和最大的路徑值。樣...