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

2021-10-08 10:34:11 字數 1605 閱讀 4712

作為乙個菜雞,研究了幾天的dp,把經典例題研究了幾遍,現在,我在這發表一下自己的菜雞見解,記錄下我對dp的理解。

dp裡面少不了遞迴,當然也能混在搜尋裡面構成記憶化搜尋作為優化,也可以用遞推來動態規劃。

具體你要我說動態規劃是個什麼東西,我也只能說說自己的理解:

滿足條件:

綜上,這個動態規劃很重要的就是記憶化的操作。

接下來是我學習dp的第一道入門題目

5//三角形的行數。下面是三角形

73 8

8 1 0

2 7 4 4

4 5 2 6 5

輸出最大和

題目解析:

假定maxsum(i,j)表示從i,j這個點到最後一行的最大和

d(i,j)表示i行j列的數字大小

先設初始值i與j都為0,表示從(0,0)這個點開始到最後一行的最大和。

那麼可以分解為(0,0)的下和右下兩個點到底部的最大和,其中最大的乙個數加上d(0,0)本身的數字

能夠得到:maxsum(i,j)=maxsum( maxsum(i-1,j) , maxsum(i-1,j-1) )+d(i,j)

這樣就能得到初步**

#include

using

namespace std;

#define max 101

int d[max]

[max]

;int n;

intmaxsum

(int i,

int j)

intmain()

} cout<<

maxsum(1

,1)<

}

上面這個**對於n比較小的情況是可行的,但是,時間複雜度是2的n次方級別,因為其中遞迴呼叫涉及到了重複計算,比如下圖的紅色數字為計算次數。

那麼怎樣進行優化呢?

因為是重複計算,所以我們只需要對於重複計算的情況儲存下來,下次要用到這個重複計算的值的時候,直接呼叫就可以了。這樣就會大大節省時間。優化時間複雜度。

優化步驟:

以下是優化**

#include

#include

using

namespace std;

int d[

105]

[105];

int n;

int maxarray[

105]

[105]=

;int max;

intdg

(int x,

int y)

return maxarray[x]

[y];

}int

main()

} cout<

0,0)

;}

動態規劃入門 數字三角形

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

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

題目描述 7 3 88 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。輸入的是一行是乙個整數n 1 n 100 給出三角形的行數。下面的n行給出數字三角形...

動態規劃 數字三角形

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