动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;
对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。
动态规划算法将问题的解决方案视为一系列决策的结果:
对于题目,给的输入数组是对于阶梯的花费。
classSolution {
public:
intminCostClimbingStairs(vector<int>& cost) {
//dp[i]表示爬到第i阶楼梯需要的最小花费
vector<int> dp(cost.size() + 1, 0); //需要求爬到顶楼,即越过数组末尾元素所需要的最小花费
//因为最后要越过数组(大于),所以可能情况是尾巴前一个花费较小走两步越过数组长度一位。
//或者尾巴较小,走一步越过尾巴。
for(inti = 2; i <= cost.size(); i++)//从下标2,即第三个阶梯的花费开始算起,要想最后是最小的,路径上的每一个花费的是最小的
//每次选取最小的方案 1,2, 30
//dp【2】=向前看一步之前的花费,和这一步, 向前看两步之前的花费和这一步。 看这两个哪个是最小的。最小的就是当前数字之前(不包括当前阶梯)的花费
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
//最后返回dp最末一位的花费,dp长度 //越过数组
return dp[cost.size()];
}
};