当前位置: 首页 > news >正文

[Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解

目录

  • 1.不同路径
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 2.不同路径 II
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现
  • 3.珠宝的最高价值
    • 1.题目链接
    • 2.算法原理详解
    • 3.代码实现


1.不同路径

1.题目链接

  • 不同路径

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • 走到dp[i][j]的时候,一共有多少种方式
        请添加图片描述
    • 推导状态转移方程

      • dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
    • 初始化:dp表多开一行和一列虚拟结点,避免处理边界

      • dp[0][1] = 1 || dp[1][0] = 1
        请添加图片描述
    • 确定填表顺序:从上往下,从左往右

    • 确定返回值:dp[n][m]

  • 上述如果dp表不多开那一行和一列虚拟结点会怎么样?
    • 需要做边界处理,将第一列和第一行先初始化为1

3.代码实现

int uniquePaths(int n, int m) 
{vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));dp[0][1] = 1;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[n][m];
}

2.不同路径 II

1.题目链接

  • 不同路径 II

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • 走到dp[i][j]的时候,一共有多少种方式
        请添加图片描述
    • 推导状态转移方程

      • dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
        请添加图片描述
    • 初始化:dp表多开一行和一列虚拟结点,避免处理边界

      • dp[0][1] = 1 || dp[1][0] = 1
        请添加图片描述
    • 确定填表顺序:从上往下,从左往右

    • 确定返回值:dp[n][m]


3.代码实现

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

3.珠宝的最高价值

1.题目链接

  • 珠宝的最高价值

2.算法原理详解

  • 思路
    • 确定状态表示 -> dp[i][j]的含义

      • 到达dp[i][j]的时候,此时的最大价值
    • 推导状态转移方程

      • dp[i][j] = max(dp[i - 1][j] + dp[i][j - 1]) + g[i][j]
        请添加图片描述
    • 初始化:dp表多开一行和一列虚拟结点,避免处理边界

      • 第一行和第一列全部初始化为0即可
    • 确定填表顺序:从上往下,从左往右

    • 确定返回值:dp[n][m]


3.代码实现

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

相关文章:

  • python+selenium - UI自动框架之封装查找元素
  • 单点登录【demo】
  • 【设计模式】JAVA Design Patterns——Combinator(功能模式)
  • 浅析智能体开发(第二部分):智能体设计模式和软件架构
  • Redis篇 浅谈分布式系统
  • js setTimeout、setInterval、promise、async await执行顺序梳理
  • 30.包名的修改和新建后端模块
  • 【UE5.1 角色练习】06-角色发射火球-part2
  • 温故而知新-Java基础篇【面试复习】
  • C#-根据日志等级进行日志的过滤输出
  • FreeRTOS面试题汇总
  • vmware - 主机向虚拟机拷贝文件的临时方法
  • JAVA开发面试超详细
  • 若依nodejs版本过高问题解决方案
  • 【vue】封装的天气展示卡片,在线获取天气信息
  • 【Leetcode】101. 对称二叉树
  • 【前端学习】-粗谈选择器
  • CAP 一致性协议及应用解析
  • input实现文字超出省略号功能
  • Java基本数据类型之Number
  • LeetCode29.两数相除 JavaScript
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • mockjs让前端开发独立于后端
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Vue 2.3、2.4 知识点小结
  • vuex 学习笔记 01
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 关于springcloud Gateway中的限流
  • 前端性能优化——回流与重绘
  • 三栏布局总结
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 微信开源mars源码分析1—上层samples分析
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 为什么要用IPython/Jupyter?
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # 达梦数据库知识点
  • ###项目技术发展史
  • #pragam once 和 #ifndef 预编译头
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • #在 README.md 中生成项目目录结构
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C语言)逆序输出字符串
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (万字长文)Spring的核心知识尽揽其中
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET gRPC 和RESTful简单对比
  • .Net 基于MiniExcel的导入功能接口示例
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • @Async 异步注解使用
  • @SuppressLint(NewApi)和@TargetApi()的区别