數字三角形(動態規劃入門題)

2021-10-09 07:45:03 字數 1948 閱讀 4877

題目描述

7

3 88 1 0

2 7 4 4

4 5 2 6 5

(圖1)

圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。

輸入的是一行是乙個整數n (1 < n <= 100),給出三角形的行數。下面的n行給出數字三角形。數字三角形上的數的範圍都在0和100之間。

輸出

輸出最大的和

樣例輸入

5

73 8

8 1 0

2 7 4 4

4 5 2 6 5

樣例輸出

**解法一:**如果採用遞迴的方法,深度遍歷每條路徑,存在大量重複計算。時間複雜度為2n次方,超時。可將maxsum(r,j)(r行j列的數最大路徑儲存起來),則時間複雜度縮短為n2。

**

#include

using

namespace std;

const

int max =

101;

int d[max]

[max]

;int maxsum[max]

[max]

;int n;

intmaxsum

(int i,

int j)

return maxsum[i]

[j];

}int

main()

cout <<

maxsum(1

,1)<< endl;

return0;

}

解法二

從n行開始往上一行一行向上遞推。只需二維陣列maxsum儲存即可。

#include

using

namespace std;

const

int max =

101;

int d[max]

[max]

;int maxsum[max]

[max]

;int n;

intmain()

for(

int i =

1;i <= n;i++

) maxsum[n]

[i]= d[n]

[i];

//記錄n行值

for(

int i = n -

1;i >=

1;i--

)for

(int j =

1;j <= i;j++

) maxsum[i]

[j]=

max(maxsum[i +1]

[j],maxsum[i +1]

[j +1]

)+ d[i]

[j];

cout << maxsum[1]

[1]<< endl;

return0;

}

還可進一步空間優化,二維降一維,只要一維陣列maxsum[100]即可,儲存一行的maxsum值就可以。

#include

using

namespace std;

int* maxsum,a[

101]

[101];

intmain()

動態規劃入門 數字三角形

給定乙個由n行數字組成的數字三角形,如下圖所示 從上到下最大的值的總和。這道題在動態規劃裡是入門級的題目,運用到了遞迴。對於這道題共有兩個思路,第一種是從上向下推,第二種是從下向上推。先從第一種分析。我們設這個二維陣列為dp,在推導的時候我們先把遞的公式寫出來,從上向下退的話,zui a i j m...

動態規劃入門1 數字三角形 C

作為乙個菜雞,研究了幾天的dp,把經典例題研究了幾遍,現在,我在這發表一下自己的菜雞見解,記錄下我對dp的理解。dp裡面少不了遞迴,當然也能混在搜尋裡面構成記憶化搜尋作為優化,也可以用遞推來動態規劃。具體你要我說動態規劃是個什麼東西,我也只能說說自己的理解 滿足條件 綜上,這個動態規劃很重要的就是記...

動態規劃 數字三角形

如圖所示的數字三角形,從頂部出發,在每一結點可以選擇向左走或得向右走,一直走到底層,要求找出一條路徑,使路徑上的值最大。第一行是數塔層數n 1 n 100 第二行起,按數塔圖形,有乙個或多個的整數,表示該層節點的值,共有n行。輸出最大值。5 1311 8 12 7 26 6 14 15 8 12 7...