其实类似于爬楼梯的基础问题,搞清楚dp数组的含义很关键
思路:
1. dp[i] : 含义: 到达下标为i的台阶需要的 最小 花费;
2. 然后,因为可以从下标为0开始的台阶开始,所以dp[0] = 0; 也可以从下标为1开始的台阶开始,所以dp[0] = 0;
3. 之后,dp[1]: 可以从 下标为0 上两个台阶到达,也可以从 下标为1 上一个台阶到达,所以求一下两者的最小值即可
4. 那么dp[3]、dp[4]... dp[i] 呢? 都可以从前两次的花费退出来,即可以从下标为i - 1在上一个台阶到达, 也可以从下标为 i - 2的台阶再上两个台阶达到: 两者分别花费 : dp[i - 1] + cost[i -1] 和 dp[i - 2] + cost[i - 2],所以在求一个二者的最小值即可。
复杂度
- 时间复杂度: O(n)
- 空间复杂度: O(n)
Code
#define MIN(a,b) ((a) > (b) ? (b) : (a))
int minCostClimbingStairs(int* cost, int costSize) {
int* dp = (int*)malloc(sizeof(int) * (costSize+1));
dp[0] = 0;
dp[1] = 0;
dp[2] = MIN(cost[0],cost[1]);
for(int i = 3; i <= costSize; i ++){
int one = dp[i - 1] + cost[i - 1];
int two = dp[i - 2] + cost[i -2];
dp[i] = MIN(one,two);
}
return dp[costSize];
}