动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;
对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。
动态规划算法将问题的解决方案视为一系列决策的结果:
对于题目,给的输入数组是对于阶梯的花费。
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()];
    }
};