動態規劃略有所得 數字三角形 POJ1163

2022-09-07 01:36:09 字數 2803 閱讀 2134

在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或 右下走。只需要求出這個最大和即可,不必給出具體路徑。 三角形的行數大於1小於等於100,數字為 0 - 99

輸入格式:

5      //表示三角形的行數    接下來輸入三角形

3   8

8   1   0

2   7   4   4

4   5   2   6   5

要求輸出最大和

用遞迴解決很簡單,從上到下遍歷一邊。

從第一行第乙個開始尋找,判斷左下或右下哪乙個更大,用快取陣列提高效率

1

if (i>=n||j>=n)

4if (cache[i][j] != -1)

7return cache[i][j]=math.max(maxsum(i+1, j, n), maxsum(i+1,j+1,n))+num[i][j];

8

但是遞迴的效率很慢,不是乙個好方法。

那麼動態規劃呢。

從下至上,首先計算最底層 。底層是無需計算的,儲存即可。

下一步計算倒數第二層。

那麼用迴圈就可以很簡單的計算出最上面的第一行第乙個即為所求

1

public

class

poj1163

14 i++;15}

16for (int j = 0; j < n; j++)

19long starttime=system.currenttimemillis(); //

獲取開始時間

20 system.out.println(maxsum(0,0,n,cache,num));

21long endtime=system.currenttimemillis(); //

獲取結束時間

2324

int cal = new

int[n][n];

25 starttime=system.currenttimemillis(); //

獲取開始時間

26for (i = 0; i < n; i++)

29for ( i = n-2; i >= 0; i--) 33}

34 system.out.println(cal[0][0]);

35 endtime=system.currenttimemillis(); //

獲取結束時間

3738}39

public

static

int maxsum(int i,int j, int n, int cache,int

num)

43if (cache[i][j] != -1)

46return cache[i][j]=math.max(maxsum(i+1, j, n,cache,num), maxsum(i+1, j+1,n,cache,num))+num[i][j];47}

4849 }

還有一種節省空間的方法 用一維陣列儲存最大值

1

int cal1 = new

int[n];

2for (i = 0; i < n; i++)

5for ( i = n-2; i >= 0; i--)

9 }

接下來,我們就進行一下總結:

遞迴到動規的一般轉化方法

遞迴函式有n個引數,就定義乙個n維的陣列,陣列的下標是遞迴函式引數的取值範圍,陣列元素的值是遞迴函式的返回值,這樣就可以從邊界值開始, 逐步填充陣列,相當於計算遞迴函式值的逆過程。

動規解題的一般思路

1. 將原問題分解為子問題

2.確定狀態

整個問題的時間複雜度是狀態數目乘以計算每個狀態所需時間。在數字三角形裡每個「狀態」只需要經過一次,且在每個狀態上作計算所花的時間都是和n無關的常數。

3.確定一些初始狀態(邊界狀態)的值

以「數字三角形」為例,初始狀態就是底邊數字,值就是底邊數字值。

4. 確定狀態轉移方程

定義出什麼是「狀態」,以及在該「狀態」下的「值」後,就要找出不同的狀態之間如何遷移――即如何從乙個或多個「值」已知的 「狀態」,求出另乙個「狀態」的「值」(遞推型)。狀態的遷移可以用遞推公式表示,此遞推公式也可被稱作「狀態轉移方程」。

數字三角形的狀態轉移方程:

能用動規解決的問題的特點

1) 問題具有最優子結構性質。如果問題的最優解所包含的 子問題的解也是最優的,我們就稱該問題具有最優子結 構性質。

2) 無後效性。當前的若干個狀態值一旦確定,則此後過程的演變就只和這若干個狀態的值有關,和之前是採取哪種手段或經過哪條路徑演變到當前的這若干個狀態,沒有關係。

動態規劃 數字三角形

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

動態規劃 數字三角形

7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得 路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或 右下走。只需要求出這個最大和即可,不必給出具體路徑。三角形的行數大於1小於等於100,數字為 0 99 5 三角形行數。下面是三...

動態規劃 數字三角形

在用動態規劃解題時,我們往往將和子問題相關的各個變數的一組取值,稱之為乙個 狀態 乙個 狀態 對應於乙個或多個子問題,所謂某個 狀態 下的 值 就是這個 狀態 所對應的子問題的解。以 數字三角形 為例,初始狀態就是底邊數字,值就是底邊數字值。定義出什麼是 狀態 以及在該 狀態 下的 值 後,就要找出...