算法刷题-动态规划2(继续)

算法刷题-动态规划2

  • 珠宝的最高价值
  • 下降路径最小和
  • 使用最小花费爬楼梯
  • 整数拆分

珠宝的最高价值

题目
在这里插入图片描述
大佬思路
多开一行使得代码更加的简洁

移动到右侧和下侧
dp[ i ][ j ]有两种情况:
第一种是从上面来的礼物最大价值:dp[ i ][ j ] = dp[ i - 1 ][ j ] + g[ i ][ j ]
第二种是从左面来的礼物最大价值:dp[ i ][ j ] = dp[ i ][ j - 1 ] + g[ i ][ j ]
所以得出状态表达式,dp[ i ][ j ] = max( dp[ i ][ j - 1 ],dp[ i - 1 ][ j ] ) + g[ i ][ j ]
2。为了简洁代码,多增加一行

class Solution {public int maxValue(int[][] grid) {int m = grid.length;int n = grid[0].length;//dp[i][j]表示从grid[0][0]到grid[i - 1][j - 1]时的最大价值int[][] dp = new int[m + 1][n + 1];for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];}}return dp[m][n];}
}class Solution { 
public: int maxValue(vector<vector<int>>& grid) { int m = grid.size(), n = grid[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[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];}}return  dp[m][n]; }
};

下降路径最小和

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

头文件: #include< algorithm >
返回值: 两个函数返回的都是迭代器,所以要提取数值的话需要在函数前加上*
语法格式: max_element(first,end,cmp);其中cmp为可选择参数(自定义排序可用,默认不需要填)
两个函数默认都是从小到大排列, max_element() 输出最后一个值, min_element() 输出第一个值。
这里要特别注意:如果自定义排序是从大到小的, max_element() 和min_element() 的返回结果相反,也就是说max_element()返回的是最小值,min_element()返回的是最大值 。

  • 定义函数dp[i][j] ,是关于路径到达 i,j 点的最小值
  • 然后找 关系式,分析最后一点是从哪里得到的, 从左上方来:dp[ i - 1 ][ j - 1 ] + m[ i ][ j ],从正上方来:dp[ i - 1 ][ j ] + m[ i ][ j ], 从右上方来:dp[ i - 1 ][ j + 1 ] + m[ i ][ j ]
class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {int n = matrix.size();vector<vector<int>> dp(n, vector<int>(n));copy(matrix[0].begin(), matrix[0].end(), dp[0].begin());for (int i = 1; i < n; i++) {for (int j = 0; j < n; j++) {int mn = dp[i - 1][j];if (j > 0) {mn = min(mn, dp[i - 1][j - 1]);}if (j < n - 1) {mn = min(mn, dp[i - 1][j + 1]);}dp[i][j] = mn + matrix[i][j];}}return *min_element(dp[n - 1].begin(), dp[n - 1].end());}
//INT_MAX = 2 ^ 31 - 1,INT_MIN = -2 ^ 31.
//防止越界,在左边,上面和右边都增加一行
//并且将第一行定义为0
class Solution {
public:int minFallingPathSum(vector<vector<int>>& matrix) {int m = matrix.size(), n = matrix[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 2, INT_MAX));for (auto& e : dp[0]) e = 0; for (int i = 1; i <= m; 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 ans = INT_MAX;  for (const auto& k : dp[m]) ans = min(ans, k);  return ans;  }
};

使用最小花费爬楼梯

题目

使用递归操作的几个步骤
1.明确dp[]函数的含义
2.明确关系式
3.进行初始化操作
4.确定遍历操作

在这里插入图片描述

class Solution {//本题是要求跳到最后一个台阶+1的位置public int minCostClimbingStairs(int[] cost) {  int len = cost.length;  //dp表示停留在第i个台阶上的花费  int[] dp = new int[len + 1];  //可以从第一个或第0个台阶起跳  dp[0] = 0;  dp[1] = 0;  //到达第i个台阶要么是从dp[i-2]跳两个台阶上来,要么从do[i-1]跳一个台阶上来  for (int i = 2; i <= len; i++) {  dp[i] = Math.min(dp[i - 2] + cost[i - 2], dp[i - 1] + cost[i - 1]);}return dp[len];  }

整数拆分

题目
在这里插入图片描述
递归操作

1.确定dp数组含义
dp[i]:分拆数字i,可以得到的最大乘积为dp[i]
2.明确关系式
3.数组初始化
4.遍历顺序

大佬讲解
(无敌解释)

class Solution       {
public:/*** 1. 确定dp数组下标含义 分拆数字i,可以得到的最大乘积为dp[i];* 2. 递推公式 dp[i] = max(dp[i], (i - j) * j, dp[i - j] * j);* 3. 初始化 dp[2] = 1;* 4. 遍历顺序 从前向后遍历就可以;* 5. 推导结果;*/int integerBreak(int n) {/* 定义dp数组 */vector<int> dp(n + 1);/* dp数组初始化 */dp[2] = 1;/* 从前向后遍历 */for (int i = 3; i <= n ; i++) {/* j遍历到小于i的值 */for (int j = 1; j < i - 1; j++) {dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));}}return dp[n];}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/211779.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【封装UI组件库系列】封装Icon图标组件

封装UI组件库系列第三篇封装Icon图标组件 &#x1f31f;前言 &#x1f31f;封装Icon 1.创建Icon组件 2.引用svg图标库 第一步 第二步 第三步 3.二次封装 4.封装自定义属性 &#x1f31f;总结 &#x1f31f;前言 在前端开发中&#xff0c;大家可能已经用过各种各样的UI组…

cookie的跨站策略 跨站和跨域

借鉴&#xff1a;Cookie Samesite简析 - 知乎 (zhihu.com) 1、跨站指 协议、域名、端口号都必须一致 2、跨站 顶级域名二级域名 相同就行。cookie遵循的是跨站策略

LangChain的函数,工具和代理(一):OpenAI的函数调用

一、什么是函数调用功能 几个月前OpenAI官方发布了其API的函数调用功能(Function calling), 在 API 调用中&#xff0c;您可以描述函数&#xff0c;并让模型智能地选择输出包含调用一个或多个函数的参数的 JSON 对象。API函数“ChatCompletion” 虽然不会实际调用该函数&#…

批量创建表空间数据文件(DM8:达梦数据库)

DM8:达梦数据库 - - 批量创建表空间数据文件 环境介绍1 批量创建表空间SQL2 达梦数据库学习使用列表 环境介绍 在某些场景(分区表子表)需要批量创建表空间,给不同的表使用,以下代码是批量创建表空间的SQL语句; 1 批量创建表空间SQL --创建 24个数据表空间,每个表空间有3个数…

经典的回溯算法题leetcode组合问题整理及思路代码详解

目录 组合问题 leetcode77题.组合 leetcode216题.组合总和III leetcode40题.组合总和II leetcode39题.组合总和 倘若各位不太清楚回溯算法可以去看我上一篇文章。 回溯算法详解-CSDN博客 组合问题 一般组合和排列类的问题我们都会转化成一个树形问题&#xff0c;更便于…

使用Typecho搭建个人博客网站,并内网穿透实现公网访问

使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问 文章目录 使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 …

通过CLSID修改Windows右键菜单顺序

效果 排序顺序&#xff1a; 上下文菜单分为3个区&#xff1a; 2 - 默认菜单部分 (在顶部). 1 - 发送到、复制到、移动到 菜单部分(在中间). 0 - 重命名菜单部分 (在底部). 调整菜单步骤&#xff1a; 打开regeditHKEY_CLASSES_ROOT > CLSID 键.在 CLSID, 寻找你想修改位置…

机器学习【01】相关环境的安装

学习实例 参考资料&#xff1a;联邦学习实战{杨强}https://book.douban.com/subject/35436587/ 项目地址&#xff1a;https://github.com/FederatedAI/Practicing-Federated-Learning/tree/main/chapter03_Python_image_classification 一、环境准备 GPU安装CUDA、cuDNN pytho…

JavaScript基础—引入方式、注释和结束符、输入和输出、变量、常量、数据类型、检测数据类型、类型转换、综合案例—用户订单信息

版本说明 当前版本号[20231123]。 版本修改说明20231123初版 目录 文章目录 版本说明目录JavaScript 基础 - 第1天介绍引入方式内部方式外部形式 注释和结束符单行注释多行注释 结束符输入和输出输出输入 变量声明赋值变量初始化更新变量 关键字变量名命名规则 常量数据类型…

深度之眼Paper带读笔记GNN.08.GCN(下)

文章目录 前言细节四&#xff1a;卷积核介绍图卷积核初代目图卷积核二代目契比雪夫多项式例子小结 GCN公式推导 实验设置和结果分析数据集节点分类任务消息传递方式比较运行效率 总结关键点创新点启发点 代码复现train.pyutil.pymodel.pylayer.py 作业 前言 本课程来自深度之眼…

【C++】POCO学习总结(五):功能介绍

【C】郭老二博文之&#xff1a;C目录 1、POCO 简介 github&#xff1a;https://github.com/pocoproject/poco 官网&#xff1a;https://pocoproject.org/index.html POCO第一个版本于 2005 年 2 月发布 POCO完全免费&#xff1a;POCO C 库根据 Boost 软件许可证获得许可。非…

Vue框架学习笔记——Vue实例中el和data的两种写法

文章目录 前文提要Vue实例的el第一种写法第二种写法小结 Vue实例中data第一种写法&#xff0c;对象式效果图片第二种写法&#xff0c;函数式效果图片小结 前文提要 本文仅做自己的学习记录&#xff0c;如有错误&#xff0c;请多谅解 Vue实例的el 第一种写法 <body><…