(dp)數字三角形

2021-08-15 03:41:17 字數 2385 閱讀 4717

數字三角形問題。有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行 之外每個數的左下方和右下方各有乙個數

從第一行的數開始,每次可以往左下或右下走一格,直到走到最下行,把沿途經過的數 全部加起來。如何走才能使得這個和盡量大?

具體實現**中的d我們用maxsum表示

最初的位置我們用d存

1.把當前的位置(i, j)看成乙個狀態,然後定義狀態(i, j)的指標函式d(i, j)為從格仔(i, j)出發時能得到的最大和 (包括格仔(i, j)本身的值)。在這個狀態定義下,原問題的解是d(1, 1)。

2.不同狀態之間是如何轉移的。從格仔(i, j)出發有兩種決策。如果往左走,則走 到(i+1, j)後需要求「從(i+1, j)出發後能得到的最大和」這一問題,即d(i+1, j)。類似地,往右走之後需要求解d(i+ 1 , j+1)。由於可以在這兩個決策中自由選擇,所以應選擇d(i+1,j) 和d(i+1,j+1)中較大的乙個。

3.狀態轉移方程:d(i,j)=a(i,j)+max

4.如果往左走,那麼最好情況等於(i, j)格仔裡的值a(i, j)與「從(i+1, j)出發的最大總和」之 和,注意這裡的「最大」二字。如果連「從(i+1,j)出發走到底部」這部分的和都不是最大 的,加上a(i, j)之後肯定也不是最大的。這個性質稱為最優子結構(optimal substructure), 也可以描述成「全局最優解包含區域性最優解」

5.狀態和狀態轉移方程一起完整地描 述了具體的演算法。

可以用記憶化搜尋的方法計算狀 態轉移方程。當採用記憶化搜尋時,不必事先確 定各狀態的計算順序,但需要記錄每個狀態「是 否已經計算過」。

題目中說各個數都是非 負的,因此如果已經計算過某個d[i][j],則它應是非負的。這樣,只需把所有d初始化為- 1,即可通過判斷是否d[i][j]!=-1得知它是否已經被計算過。

#include

#include

#include

using

namespace

std;

#define maxx 101

int d [maxx][maxx];

int n;

int maxsum[maxx][maxx];

int ms(int i,int j);

int main()

cout

<1,1)

return maxsum[i][j];

}

i是 逆序列舉 的,因此在計算d[i][j]前,它所需要的d[i+1][j]和d[i+1][j+1]一定已經計算出來了。

最底下的元素d(i,j)的maxsum[i][j]一定是他自身

這樣我們可以自下而上地推出每乙個d(i,j)的maxsum

#include

#include

#include

using namespace std;

#define maxx 101

int d [maxx][maxx];

int n;

int maxsum[maxx][maxx];

int main()

for(i=1;i<=n;++i)

maxsum[n][i]=d[n][i];

for(i=n-1;i>=1;--i)

for(j=1;j<=i;++j)

maxsum[i][j]=max(maxsum[i+1][j],maxsum[i+1][j+1])+d[i][j];

cout

用一維陣列存:

//直接用d的第n行代替

#include

#include

#include

using

namespace

std;

#define maxx 101

int d [maxx][maxx];

int n;

int *maxsum;

int main()

maxsum=d[n];

for(i=n-1;i>=1;--i)

for(j=1;j<=i;++j)

maxsum[j]=max(maxsum[j],maxsum[j+1])+d[i][j];

cout

<1]<

}

數字三角形 DP

數字三角形 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 問題描述 小hi和小ho在經歷了螃蟹先生的任務之後被獎勵了一次出國旅遊的機會,於是他們來到了大洋彼岸的美國。美國人民的生活非常有意思,經常會有形形色色 奇奇怪怪的活動舉辦,這不,小hi和小ho剛剛下飛機,就趕上了當...

數字三角形 dp

給定乙個如下圖所示的數字三角形,從頂部出發,在每一結點可以選擇移動至其左下方的結點或移動至其右下方的結點,一直走到底層,要求找出一條路徑,使路徑上的數字的和最大。73 8 8 1 0 2 7 4 4 4 5 2 6 5 輸入格式 第一行包含整數n,表示數字三角形的層數。接下來n行,每行包含若干整數,...

經典DP 數字三角形

題目描述 輸入 第一行乙個整數n 1000 表示三角形總共有幾行 第二至第n 1行,給出這個數字三角形。輸出 乙個整數,表示一路上所有數的最大和,結果不會超過int64。樣例輸入 4 1 3 2 4 10 1 4 3 2 20 樣例輸出 24 分析 我們可以定義f i j 表示走到第i行第j列的時候...