120. 三角形最小路径和
三种解法:dfs到记忆化递归再到动态规划
dfs(超时):
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
return dfs(triangle,0,0);
}
int dfs(List<List<Integer>> triangle,int pos,int x){
if(pos==triangle.size()||x==triangle.get(pos).size())return 0;
int a= dfs(triangle,pos+1,x);
int b= dfs(triangle,pos+1,x+1);
return triangle.get(pos).get(x)+Math.min(a,b);
}
}
记忆化递归:
class Solution {
HashMap<String,Integer> map=new HashMap<>();
public int minimumTotal(List<List<Integer>> triangle) {
return dfs(triangle,0,0);
}
int dfs(List<List<Integer>> triangle,int pos,int x){
if(pos==triangle.size()||x==triangle.get(pos).size())return 0;
int a=0;
int b=0;
String str1=new String((pos+1)+"+"+x);
if(map.containsKey(str1))
a=map.get(str1);
else
a= dfs(triangle,pos+1,x);
String str2=new String((pos+1)+"+"+(x+1));
if(map.containsKey(str2))
b=map.get(str2);
else
b= dfs(triangle,pos+1,x+1);
int num=triangle.get(pos).get(x)+Math.min(a,b);
map.put(pos+"+"+x,num);
return num;
}
}
动态规划:
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int[] dp=new int[triangle.size()];
int size=triangle.size();
int b=triangle.get(size-1).size();
for(int i=0;i<b;i++){
dp[i]=triangle.get(size-1).get(i);
}
for(int i=size-2;i>=0;i--){
b=triangle.get(i).size();
for(int j=0;j<b;j++){
dp[j]=triangle.get(i).get(j)+Math.min(dp[j],dp[j+1]);
}
}
return dp[0];
}
}