Solution 1:递归 tle
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n=cost.length-1;
int start=-1;
return help(cost,start,n);
}
public int help(int[] cost,int i,int n){
if(i>n)return 0;
if(i<0)return Math.min(help(cost,i+1,n),help(cost,i+2,n));;
return cost[i]+Math.min(help(cost,i+1,n),help(cost,i+2,n));
}
}
Solution 2: top down的dp
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n=cost.length-1;
int start=-1;
int[] dp=new int[n+1];
Arrays.fill(dp,-1);
return help(cost,start,n,dp);
}
public int help(int[] cost,int i,int n,int[] dp){
if(i>n)return 0;
if(i<0)return Math.min(help(cost,i+1,n,dp),help(cost,i+2,n,dp));;
if(dp[i]>0)return dp[i];
dp[i]=cost[i]+Math.min(help(cost,i+1,n,dp),help(cost,i+2,n,dp));
return dp[i];
}
}
Solution 3: bottom up的dp
今天突然豁然开朗了top down和bottom up
top down就是最直接的递归,一层一层下去。
bottom up就是反着来
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n=cost.length-1;
int[] dp=new int[n+3];
dp[n+1]=0;
dp[n+2]=0;
for(int i=n;i>=0;i--){
dp[i]=cost[i]+Math.min(dp[i+1],dp[i+2]);
}
return Math.min(dp[0],dp[1]);
}
}