線性DP 數字三角形

2021-10-23 04:45:21 字數 1270 閱讀 9524

問題:給定乙個如下圖所示的數字三角形,從頂部出發,在每一結點可以選擇移動至其左下方的結點或移動至其右下方的結點,一直走到底層,要求找出一條路徑,使路徑上的數字的和最大。

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

思路:每一次只能走乙個格仔,有很多條路可以走。找到一條路徑上所有數字之和最大的。

首先先把他分成i 行j列,用f[i][j]表示所有起點到f[i][j]點所有路徑之和的集合。比如第四行第二個點為7表示為(4, 2);從最後的終點往前遞推:如圖劃圈的點7,所以從起點到f[i][j]點路徑分成兩類:一種是從左上方一種是來自右上方。

左上方:比如從7那個點到8,所以需要往上走一格即f[i - 1][j - 1] 並且得加上該點的值a[i][j];

右上方:比如畫圈那個點右上方的1,跟左上方的點8在同一行,但是不同列,所以走一格即f[i - 1, j] + a[i][j];

然後不斷往上遞迴,直到到達起點為止。最後將兩種情況取max。如下圖所示:

注意邊界問題:如果涉及到i-1的下標迴圈得從i = 1開始。

動態規劃時間複雜度如何求:狀態數量 * 轉移的計算量

輸入格式

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

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

輸出格式

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

資料範圍

1≤n≤5001≤n≤500,

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

輸入樣例:

5

73 8

8 1 0

2 7 4 4

4 5 2 6 5

輸出樣例:

30
#include #include using namespace std;

const int n = 510, inf = 1e9;

int n;

int a[n][n];//表示每個點的值

int f[n][n];//存從起點到第i,j點的路徑最大長度

int main()

數字三角形 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行,每行包含若干整數,...