題目
給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
相鄰的結點 在這裏指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。
例如,給定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自頂向下的最小路徑和爲 11(即,2 + 3 + 5 + 1 = 11)。
解決方法
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
// return sum;
//使用遞歸 對於最頂層的三星形 最大值爲頂角 加上 兩個孩子當中的最大值
//每一個子孩子的最大值 又等於下面兩個孩子的最大值
// fmax(A) = fmax(left) + fmax(right)
//最小值也同理
if (triangle == null || triangle.size() == 0) {
return 0;
}
List<Integer> integers = triangle.get(0);
if (integers == null || integers.size() == 0) {
return 0;
}
int dp[][] =new int[triangle.size()][triangle.get(triangle.size()-1).size()];
return integers.get(0) + miniIndex(1,triangle,0,dp);
}
public int miniIndex(int floor,List<List<Integer>> listList,int mCurIndex,int dp[][]){
if (listList == null || floor >= listList.size()) {
return 0;
}
if (dp[floor][mCurIndex] != 0) {
return dp[floor][mCurIndex];
}
List<Integer> integers = listList.get(floor);
int min = Math.min(integers.get(mCurIndex) + miniIndex(floor + 1, listList, mCurIndex, dp), integers.get(mCurIndex + 1) + miniIndex(floor + 1, listList, mCurIndex + 1, dp));
dp[floor][mCurIndex] = min;
return min;
}
}
總結:
學習動態規劃有一段時間了,終於會用動態規劃解決問題了。這道題沒有看題解,自己寫出來的,自豪,加油~
算法的學習,我是從不會做,看題解,思考學習,然後去思考解決同類型問題,慢慢學。一道題長時間想不到怎麼做,就不要耽誤太長時間,像面試一樣,不然根本做不到一天一道題的量,然後對自己學習也沒有什麼好處。