题目
题解
动态规划第二天,解决这种问题先明确以下四个条件:
- 状态定义:dp[i] 表示到达第 i 级楼梯所需要的最小代价
- 状态转移方程:
dp[i] = min(dp[i-2]+cost[i-2], dp[i-1]+cost[i-1])
,要么从i-2级台阶跨两步上来,要么从i-1级台阶迈一步上来 - 初始条件:dp[0]=dp[1]=0,可以从第0级或者第一级台阶开始,则它们的初始花费都是0
- 返回值:dp[n]
class Solution {
public int minCostClimbingStairs(int[] cost) {
int n=cost.length;
int[] dp=new int[n+1];
dp[0]=0;
dp[1]=0;
for(int i=2;i<=n;i++){
dp[i]=Math.min(dp[i-2]+cost[i-2],dp[i-1]+cost[i-1]);
}
return dp[n];
}
}
时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n),当然也可以用常数个变量代替dp数组,空间复杂度O(1),但是感觉dp数组更好理解,就贴的这个代码