IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 复习一下dp动规 -> 正文阅读

[数据结构与算法]复习一下dp动规

动规解决的问题:

重复子问题;

动规与贪心的区别:

贪心是局部选优,不涉及到状态迁移问题;

动规写法:

动规分为普通动规以及背包问题,写法皆为 动规五部曲

首先,明确动规数组含义;

其次,明确递推公式;

然后,确定初始化;

再者,确定遍历顺序;

最后,出错打印数组;

举例:

1.? 爬楼梯消费体力问题:leetcode 746

?思路:

重复子问题:每次爬楼梯都是 一层或者两层--->选择动规;

五部曲:

dp[i] 含义:爬到下标为 i 层的楼梯需要的最小花费;

规定 :

爬到某一层时需要花费该层的体力。

离开该层不花费体力。

爬到顶层,顶层不花费体力

注意区别:问题是询问爬到楼顶的花费,我们设的是爬到某层楼梯的花费!!

递推公式:如果爬到下标为2的楼梯,根据 每次 爬? 1 / 2 层可知,可以从0 爬两层到2,也可以从1爬1层到2;即:

dp[2]=min(dp[0],dp[1])+cost[2];

则,爬到顶层,即 下标为 2 楼梯的 下一层【楼梯总数为3】,最低花费可以是:

min(dp[2],dp[1])

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

遍历顺序:从前往后

打印数组:略

代码:

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size());
        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];
        }
        // 注意最后一步可以理解为不用花费,所以取倒数第一步,第二步的最少值
        return min(dp[cost.size() - 1], dp[cost.size() - 2]);
    }
};

2.? 机器人路径问题 leetcode 62

??思路:

重复子问题:每次机器人都是往下走或者往右走--->选择动规;

五部曲:

dp[i][j]?含义:到达第【i,j】需要多少步;

注意:何时选择二维dp,一维dp,根据题目的要求,此题给了二维网格,显然用二维更好

递推公式因为每次机器人走法,只能向右或者向下,则到达第 (i,j)处,只能通过左边或者上方走到,即:

dp[i][j]=dp[i-1][j]+dp[i][j-1];

初始化:dp[0][j]=1;dp[i][0]=1;

遍历顺序:从前往后

打印数组:略

?代码:

class?Solution?{

public:

????int?uniquePaths(int?m,?int?n)?{

????????vector<vector<int>>dp(m,vector<int>(n));

????????//dp[i][j]表示到达下标?(i,j)的路径数

????????//递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1];

????????//初始化:dp[0][j]=1,dp[i][0]=1;

????????//遍历顺序:从前往后;

????????//打印数组

????????for(int?i=0;i<m;i++)dp[i][0]=1;

????????for(int?j=0;j<n;j++)dp[0][j]=1;

????????for(int?i=1;i<m;i++){

????????????for(int?j=1;j<n;j++){

????????????????dp[i][j]=dp[i-1][j]+dp[i][j-1];

????????????}

????????}

????????return?dp[m-1][n-1];

????}

};

3. 机器人路径问题,有障碍 leetcode? 63

与上题不同在于,此题路径中有障碍:

如何考虑?

如果有障碍,则说明所有原本经过该位置【原来无障碍,现在有障碍】到达目的地的走法都不能够计入路径总数!

因此,我们将经过该路径时的dp值不更新即可!

代码:

class?Solution?{

public:

????int?uniquePathsWithObstacles(vector<vector<int>>&?obstacleGrid)?{

????????int?m=obstacleGrid.size();

????????int?n=obstacleGrid[0].size();

????????vector<vector<int>>dp(m,vector<int>(n));

????????//dp[i][j]表示到达下标?(i,j)的路径数

????????//递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1];

????????//初始化:dp[0][j]=1,dp[i][0]=1;

????????//遍历顺序:从前往后;

????????//打印数组

????????for(int?i=0;i<m&&obstacleGrid[i][0]==0;i++)dp[i][0]=1;

????????for(int?j=0;j<n&&obstacleGrid[0][j]==0;j++)dp[0][j]=1;

????????for(int?i=1;i<m;i++){

????????????for(int?j=1;j<n;j++){

????????????????if(obstacleGrid[i][j]==1)continue;

????????????????dp[i][j]=dp[i-1][j]+dp[i][j-1];

????????????}

????????}

????????return?dp[m-1][n-1];

????}

};

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-08-06 11:07:37  更:2022-08-06 11:10:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:31:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码