0
点赞
收藏
分享

微信扫一扫

动态规划之练习【1】

快乐码农Alan007 2022-03-30 阅读 59

学习安排根据《代码随想录》

跳了——leetcode746

根据 动规五步,自己写了一个代码,漏洞百出:【以下是错的】

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) 
    {
       int n=cost.size();
       int result;
        vector<int>dp(n+1);
        // 确定 dp[i] 及含义 :dp[i] 表示 从第 i 个台阶开始的总花费 dp

        //确定 递推公式:dp[i]=min(cost[i-1],cost[i-2])

        // 确定初始化:dp[0]=cost[0],dp[1]=min(cost[0],cost[1]);
        dp[0]=cost[0];dp[1]=min(cost[0],cost[1]);
        //确定遍历顺序
        for(int i=2;i<n;i++)
               { dp[i]=min(cost[i-1],cost[i-2]);result=dp[i];}
        //验证dp
        return result;
    }
};

正确代码及思路:

1.确定dp数组 以及含义:i 表示 第i 个台阶开始,dp[i]表示 到达第 i 个台阶所花费的最少体力

2.确定递推公式:dp[i]=min(dp[i-1],dp[i-2])+cost[i]

(为什么是cost[i]?不是cost[i-1] or cost[i-2]?  答:到达第 i 个台阶 也需要花费 当前台阶的体力

3.初始化:dp[0]=cost[0],dp[1]=cost[1]

(为什么cost[1]不是求最小?  答:下标为1 为 2个台阶 题目说明 可以一步跨一个台阶 或者两个台阶)

4.确定遍历顺序:从前往后

5.验证dp

代码:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size());
        int result;
        dp[0] = cost[0];
        dp[1] = cost[1];
        for (int i = 2; i < cost.size(); i++) {
            dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i];
        }
 // 注意最后一步可以理解为不用花费,所以取倒数第一步,第二步的最少值!!!!
        result=min(dp[cost.size()-1],dp[cost.size()-2]);
        return result;
    }
举报

相关推荐

0 条评论