题目地址:
https://www.lintcode.com/problem/min-cost-climbing-stairs/description
给定一个数组 , 表示走到 这个位置所需的花费(题目保证花费非负)。允许从 或 开始走,每次可以走 或 步,问若要到达 的末尾再后面一格至少需要多少花费。
思路是动态规划。设 表示要走到 这个位置所需的最小花费。那么 , ,并且 。要求的答案即为 最后两个位置的数中较小的那个。代码如下:
public class Solution {/*** @param cost: an array* @return: minimum cost to reach the top of the floor*/public int minCostClimbingStairs(int[] cost) {// Write your code hereif (cost == null || cost.length == 0) {return 0;}int len = cost.length;if (len == 1 || len == 2) {return cost[len - 1];}int[] dp = new int[len];dp[0] = cost[0];dp[1] = cost[1];// 开始递推for (int i = 2; i < len; i++) {dp[i] = cost[i] + Math.min(dp[i - 1], dp[i - 2]);}return Math.min(dp[len - 1], dp[len - 2]);}
}
时空复杂度 。