給定乙個數字三角形,找到從頂部到底部的最小路徑和。每一步可以移動到下面一行的相鄰數字上。
比如,給出下列數字三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
從頂到底部的最小路徑和為11 ( 2 + 3 + 5 + 1 = 11)。
如果你只用額外空間複雜度o(n)的條件下完成可以獲得加分,其中n是數字三角形的總行數。
解題思路:這個題目跟那個數塔的問題非常相似的,數塔求的是最長路徑,而這個問題求的是最短路徑。一樣的分析,從底向上分析,就每次選取兩個子節點中較小的那個。最後頂層的那個節點就是所求的值。
**:
public class solution
if (********[0] == null || ********[0].length == 0)
int len = ********.length;
for(int i=len-2;i>=0;i--)
}return ********[0][0];
}}
其他解題方法:
// version 0: top-down
public class solution
if (********[0] == null || ********[0].length == 0)
// state: f[x][y] = minimum path value from 0,0 to x,y
int n = ********.length;
int f = new int[n][n];
// initialize
f[0][0] = ********[0][0];
for (int i = 1; i < n; i++)
// top down
for (int i = 1; i < n; i++)
}// answer
int best = f[n - 1][0];
for (int i = 1; i < n; i++)
return best;
}}//version 1: bottom-up
public class solution
if (********[0] == null || ********[0].length == 0)
// state: f[x][y] = minimum path value from x,y to bottom
int n = ********.length;
int f = new int[n][n];
// initialize
for (int i = 0; i < n; i++)
// bottom up
for (int i = n - 2; i >= 0; i--)
}// answer
return f[0][0];
}}//version 2 : memorize search
public class solution
if (minsum[x][y] != integer.max_value)
minsum[x][y] = math.min(search(x + 1, y), search(x + 1, y + 1))
+ ********[x][y];
return minsum[x][y];
}public int minimumtotal(int ********)
if (********[0] == null || ********[0].length == 0)
this.n = ********.length;
this.******** = ********;
this.minsum = new int[n][n];
for (int i = 0; i < n; i++)
}return search(0, 0);
}}
動態規劃 數字三角形
如圖所示的數字三角形,從頂部出發,在每一結點可以選擇向左走或得向右走,一直走到底層,要求找出一條路徑,使路徑上的值最大。第一行是數塔層數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 三角形行數。下面是三...
動態規劃 數字三角形
在用動態規劃解題時,我們往往將和子問題相關的各個變數的一組取值,稱之為乙個 狀態 乙個 狀態 對應於乙個或多個子問題,所謂某個 狀態 下的 值 就是這個 狀態 所對應的子問題的解。以 數字三角形 為例,初始狀態就是底邊數字,值就是底邊數字值。定義出什麼是 狀態 以及在該 狀態 下的 值 後,就要找出...