數字三角形 dp入門演算法

2021-09-29 02:58:29 字數 1806 閱讀 5708

例題:數字三角形

拓展題

題目:

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

表示乙個5行的數字三角形。假設給定乙個n行數字三角形,計算出從三角形頂至底的一條路徑,使該路徑經過的數字總和最大。

每一步只能由當前位置向左下或右下。

輸入格式

第一行包含整數n,表示數字三角形的層數。

接下來n行,每行包含若干整數,其中第 i 行表示數字三角形第 i 層包含的整數。

輸出格式

輸出乙個整數,表示最大的路徑數字和。

資料範圍

1≤n≤500,

−10000≤三角形中的整數≤10000

輸入樣例:57

3 88 1 0

2 7 4 4

4 5 2 6 5

輸出樣例:

30解析:

dp演算法的重點在於:要知道他是怎麼樣的狀態,並且是怎麼樣從前面那個轉移過來的,個人看法是可以理解為從上一步到當前步我應該做些什麼,dp演算法難度在於思維。

題目分析:

dp[i][j]表示從(1,1)這個起點開始,到(i,j)的最大和。

這個題目應該屬於dp演算法入門題,可以從樣例看出和題目看出,從第二行開始,每乙個位置加上的數,只會是它正上方的數或者右上方的數。

因此轉移方程為:dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+w[i][j]。這裡的意思是上方和右上方的數比較取最大乙個加到本事。

#include

using

namespace std;

const

int n=

1e3+

7,inf=

0x3f3f3f3f

;int w[n]

[n],dp[n]

[n];

//dp存放的是從起點到當前位置最大和,w是權值

intmain()

}for

(int i=

1;i<=n;i++)}

}int ans=

-1e9

;for

(int i=

1;i<=n;i++

)ans=

max(ans,dp[n]

[i])

; cout<}return0;

}

//上面的**至上而下,這個空間優化**至下而上,自行了解

#include

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int>pall;

namespace io

while

(c>=

'0'&&c<=

'9')

return o*f;}}

using

namespace io;

const

int n=

507,inf=

0x3f3f3f3f

;int a[n]

[n],dp[n]

;int

main()

}for

(int i=n-

1;i>=

1;i--)}

cout<<}return0;

}

數字三角形 DP

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

(dp)數字三角形

數字三角形問題。有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行 之外每個數的左下方和右下方各有乙個數 從第一行的數開始,每次可以往左下或右下走一格,直到走到最下行,把沿途經過的數 全部加起來。如何走才能使得這個和盡量大?具體實現 中的d我們用maxsum表示 最初的位置我們用d存 1.把...

數字三角形 dp

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