在上面的數字三角形中尋找一條從頂部到底邊的路徑,使得路徑上所經過的數字之和最大。路徑上的每一步都只能往左下或 右下走。只需要求出這個最大和即可,不必給出具體路徑。 三角形的行數大於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 三角形行數。下面是三...
動態規劃 數字三角形
在用動態規劃解題時,我們往往將和子問題相關的各個變數的一組取值,稱之為乙個 狀態 乙個 狀態 對應於乙個或多個子問題,所謂某個 狀態 下的 值 就是這個 狀態 所對應的子問題的解。以 數字三角形 為例,初始狀態就是底邊數字,值就是底邊數字值。定義出什麼是 狀態 以及在該 狀態 下的 值 後,就要找出...