题目:力扣
解题思路:
先用了回溯法,超时了,后来看题解有人用了动态规划,我也自己想想了一下,最后想出来了,耶耶耶!
class Solution {
//动态规划
public int minimumTotal(List<List<Integer>> triangle) {
int row = triangle.size();
int col = triangle.get(row-1).size();
int[] dp = new int[col];
for(int i = row -1; i >= 0; i--){
for(int j = 0; j < triangle.get(i).size(); j++){
if(i == row -1){
dp[j] = triangle.get(i).get(j);
}
else{
dp[j] = Math.min(dp[j],dp[j+1])+ triangle.get(i).get(j);
}
}
}
return dp[0];
}
//回溯法,超时了
int res = Integer.MAX_VALUE;
int n;
public int minimumTotal2(List<List<Integer>> triangle) {
n = triangle.size();
if(n == 0){
return 0;
}
List<Integer> route = new LinkedList<>();
backtrace(route, triangle, 0, 0, 0);
return res;
}
public void backtrace(List<Integer> route, List<List<Integer>> choice, int index, int cur, int sum){
if(route.size() == n){
//System.out.println(n);
res = Math.min(res, sum);
//System.out.println(res);
return;
}
int max_index = Math.min(index+1, choice.get(cur).size()-1);
for(int i = index; i <= max_index; i++){
route.add(choice.get(cur).get(i));
backtrace(route, choice, i, cur+1, sum+choice.get(cur).get(i));
route.remove(route.size()-1);
}
}
}