首页 > 其他分享 >动态规划<二>路径问题

动态规划<二>路径问题

时间:2024-10-31 20:20:45浏览次数:3  
标签:状态 int 路径 vector 动态 规划 dp size

目录

路径问题

1.第一题

2.第二题

3.第三题

 4.第四题

 5.第五题

6.第六题


路径问题

1.第一题

LeetCode<62> 不同路径

画图分析

动态规划解题的几步

1.确定状态表示

根据经验+题目要求

dp[i][j]表示走到[i,j]位置时的不同路径数

2.状态转移方程

以当前[i,j]位置状态的最近一步来划分子问题,将每个子问题用状态表示,即表示为dp[x][y]

3.初始化

4.填表顺序

从上往下填写每一行,每一行从左往右

5.返回值   dp[m][n](最右下位置)

具体代码

int uniquePaths(int m, int n) 
    {
        //1.创建dp表
        //2.初始化
        //3.填表
        //4.返回值

        vector<vector<int>>dp(m+1,vector<int>(n+1));
        dp[0][1]=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][n];
    }
2.第二题

OJ传送门:LeetCode<63> 不同路径II

画图分析:

 使用动态规划来解决

1.确定状态表示

和上题一样dp[i][j]表示走到[i,j]位置时的不同路径数

2.状态转移方程

3.初始化  与上题一样

4.调表顺序      从上往下填写每一行,每一行从左往右

5.返回值 dp[m][n]

具体代码:

int uniquePathsWithObstacles(vector<vector<int>>& ob) 
    {
        int m=ob.size(),n=ob[0].size();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        dp[1][0]=1;
        for(int i=1;i<=m;++i)
         for(int j=1;j<=n;++j)
         if(ob[i-1][j-1]==0)//注意下标的映射关系
         dp[i][j]=dp[i-1][j]+dp[i][j-1];
        return dp[m][n];
    }
3.第三题

OJ传送门 LeetCode<LCR 166>珠宝的最高价值

 画图分析

使用动态规划解决问题:

1.确定状态表示:   根据经验+题目要求

dp[i][j]表示到达[i,j]位置时的最高价值

2.状态转移方程

3.初始化

4.填表顺序 从上往下填写每一行,每一行从左往右进行填写

5.返回值 dp[m][n]

具体代码

int jewelleryValue(vector<vector<int>>& frame) 
    {
        int m=frame.size(),n=frame[0].size();
        vector<vector<int>> dp(m+1,vector<int>(n+1));
        for(int i=1;i<=m;++i)
         for(int j=1;j<=n;++j)
          //注意dp多加了一行和一列,原数组访问需要注意下标的映射关系
          dp[i][j]=max(dp[i-1][j],dp[i][j-1])+frame[i-1][j-1];
        return dp[m][n];
    }
 4.第四题

OJ传送门 LeetCode<931>下降路径最小和

画图分析

 使用动态规划解决问题

1.确定状态表示    根据经验+题目要求

dp[i][j]表示到达[i,j]位置时的最小路径和

2.状态转移方程

3.初始化

4.填表顺序 从上到下

5.返回值  

因为题目要求是到最后一行都是结束位置,只需返回最后一行的最小值就行

具体代码:

int minFallingPathSum(vector<vector<int>>& matrix) 
    {
        int n=matrix.size();
        vector<vector<int>> dp(n+1,vector<int>(n+2,INT_MAX));
        //对第一行初始化为0
        for(int i=0;i<n+2;++i)
         dp[0][i]=0;
        
        for(int i=1;i<=n;++i)
         for(int j=1;j<=n;++j)
          dp[i][j]=min(dp[i-1][j-1],min(dp[i-1][j],dp[i-1][j+1]))
                  +matrix[i-1][j-1];//注意下标的映射关系
        
        int ret=INT_MAX;
        for(int i=1;i<=n;++i)
         ret=min(ret,dp[n][i]);
        return ret;
    }
 5.第五题

OJ传送门 LeetCode<64> 最小路径和

画图分析:

 使用动态规划解决问题

1.确定状态表示      根据经验+题目要求

dp[i][j]表示到[i,j]时的最小路径和

2.状态转移方程    以最近的一步划分子问题

 3.初始化

 4.填表顺序  从上往下,从左往右

5.返回值  dp[m][n]

具体代码

int minPathSum(vector<vector<int>>& grid) 
    {
        int m=grid.size(),n=grid[0].size();
        vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));
        dp[1][0]=dp[0][1]=0;
        for(int i=1;i<=m;++i)
         for(int j=1;j<=n;++j)
          dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1];
        return dp[m][n];
    }
6.第六题

OJ传送门 LeetCode<174>地下城游戏

画图分析:

使用动态规划解决问题 

1.确定状态表示 根据经验+题目要求

若dp[i][j]表示:从起点出发走到[i,j]位置时所需的最小健康点数

可以看出上面的状态表示无法推导出状态转移方程,我们可以换一种状态表示的方式

dp[i][j]表示从[i,j]位置出发,到达终点时,所需的最小健康数

2.状态转移方程

3.初始化

4.填写顺序

从下往上填写每一行,从右往左

5.返回值 dp[0][0]

具体代码:

int calculateMinimumHP(vector<vector<int>>& d) 
    {
        int m=d.size(),n=d[0].size();
        vector<vector<int>> dp(m+1,vector<int>(n+1,INT_MAX));
        dp[m][n-1]=dp[m-1][n]=1;
        for(int i=m-1;i>=0;--i)
         for(int j=n-1;j>=0;--j)
        {
            dp[i][j]=min(dp[i+1][j],dp[i][j+1])-d[i][j];
            dp[i][j]=max(1,dp[i][j]);
        }
        return dp[0][0];
    }

标签:状态,int,路径,vector,动态,规划,dp,size
From: https://blog.csdn.net/Miwll/article/details/143372095

相关文章

  • c语言:动态内存管理中的malloc和free,calloc和realloc
    为什么要有动态内存分配?通过之前的学习,我们已经掌握的内存开辟方式有:inta=20;//在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节的连续空间上述空间的开辟的大小是固定的数组在申明的时候,必须指定数组的长度,数组空间一旦确定了大小不能进行调整。......
  • ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算(地质监测、城市规划、农业
    在科技飞速发展的时代,遥感数据的精准分析已经成为推动各行业智能决策的关键工具。从无人机监测农田到卫星数据支持气候研究,空天地遥感数据正以前所未有的方式为科研和商业带来深刻变革。原文链接:ChatGPT、Python和OpenCV支持下的空天地遥感数据识别与计算(地质监测、城市规划、......
  • Vue组件的动态加载和卸载
            组件的动态注册还是比较容易的,使用<component:is="组件id"></component>即可,但动态卸载有难度,相关文献较少。不过,如果巧妙使用vnode,就能轻松实现!       下图展示了4个代表不同文档材料的Vue组件。为简化起见,每个组件用一个DIV元素表示,其内容为一张图......
  • 序列型动态规划
    1、小蜘蛛题目描述zty一共养了n只小蜘蛛,第i只小蜘蛛有一个编号Ai,这n只小蜘蛛的编号恰好构成了一个长度为n的排列。小蜘蛛们在交友时总喜欢站成一排。他们的交友方式也很特别,每只小蜘蛛只会主动和在自己左方,且离自己最近的编号比自己小的小蜘蛛成为好朋友。若不存在,则不......
  • 在使用asm包进行动态类加载的时候的打包问题
     如图所示,开发时使用的jdk包下面的asm包,在进行打包时提示asm包不存在,打包方式使用如下: 目前提供两种解决方案:1:修改打包方式,将jdk的包也打进去:<plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><t......
  • WebMagic动态页面爬取
    动态页面爬虫前的准备:https://www.cnblogs.com/maohuidong/p/18517953一:javamaven添加依赖:<dependency><groupId>us.codecraft</groupId><artifactId>webmagic-core</artifactId><version>0.7.4</version></dependency>&......
  • el-form中关于添加el-table后动态添加el-input后怎么设置校验
    个人笔记,欢迎指正场景复现如何实现动态表单满足rules规则实现代码<el-formref="form":model="form":rules="rules"label-width="80px"><el-col:span="24"><el-form-itemlabel="客户名称"prop="cust......
  • 在K8S中,有一个公司要向具有各种环境的客户提供所有必需的分发产品的方案,如何看待他们
    在Kubernetes(K8s)环境中,一个公司若要向具有各种环境的客户提供所有必需的分发产品,并希望动态地实现这一关键目标,需要采取一系列精心设计的策略和技术。以下是对他们如何动态地实现这一目标的详细探讨:1.理解客户需求与环境多样性首先,公司需要深入理解不同客户的需求以及他们所处......
  • 揭秘JDQ限流架构:实时数据链路的多维动态带宽管控
    作者:京东零售饶璐1、背景在数字化转型的浪潮席卷之下,大数据和云计算技术已成为企业创新和发展的关键驱动力。尤其是以京东为代表的电商平台为例,其日常运营中持续生成海量数据,涵盖实时交易记录、点击曝光统计及用户行为轨迹等,这些数据对精准业务决策、深化用户体验优化等方面具......
  • 快消行业 | 超高效拜访路线规划, 抓住“每一片”利润
    高效拜访,关键在于科学规划。如何避免漏访、无效拜访或拜访不及时?拜访路线规划是破局之策,它直击终端拜访的核心痛点,助力实现最佳拜访效果,进而提升终端门店销售业绩。传统拜访模式下,业务人员往往因无提前规划而效率低下,问题频发。科学的拜访路线规划,能精准缩减行程时间,确保以最短、......