数据结构与算法——动态规划

文章目录

    • 1.内容概述
    • 2.爬楼梯
      • 2.1 题目描述
      • 2.算法思想
      • 2.3 代码实现
    • 3.打家劫舍
      • 3.1 题目描述
      • 3.2 算法思路
      • 3.3 代码实现
    • 4.最大子序和
      • 4.1 题目描述
      • 4.2 算法思路
      • 4.3 代码思路
    • 5. 零钱兑换
      • 5.1 题目描述
      • 5.2 算法思路
      • 5.3 代码实现
    • 6.三角形最小路径和
      • 6.1 题目描述
      • 6.2 算法思路
      • 6.3 代码实现
    • 7.最长递增子序列
      • 7.1 题目描述
      • 7.2 算法思路
      • 7.3 代码实现
    • 8.最小路径和
      • 8.1 题目描述
      • 8.2 代码实现
    • 9.地下城游戏
      • 9.1 题目描述
      • 9.2 算法思路
      • 9.3 代码实现

1.内容概述

在这里插入图片描述

2.爬楼梯

2.1 题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1+ 12.  2 阶示例 2:输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1+ 1+ 12.  1+ 23.  2+ 1

2.算法思想

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

2.3 代码实现

class Solution {
public:int climbStairs(int n) {vector<int> dp(n+3,0);dp[1]=1;dp[2]=2;for(int i=3;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}return dp[n];}
};

3.打家劫舍

3.1 题目描述

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12

3.2 算法思路

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

3.3 代码实现

class Solution {
public:int rob(vector<int>& nums) {if(nums.size()==1){return nums[0];}if(nums.size()==2){return max(nums[0],nums[1]);}vector<int> dp(nums.size(),0);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);for(int i=2;i<nums.size();i++){dp[i]=max(dp[i-2]+nums[i],dp[i-1]);}return dp[nums.size()-1];}
private:int max(int a,int b){return (a>b)?a:b;}
};

4.最大子序和

4.1 题目描述

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]
输出:1示例 3:输入:nums = [0]
输出:0示例 4:输入:nums = [-1]
输出:-1示例 5:输入:nums = [-100000]
输出:-100000

4.2 算法思路

在这里插入图片描述

4.3 代码思路

class Solution {
public:int maxSubArray(vector<int>& nums) {vector<int> dp(nums.size(),0);dp[0]=nums[0];int max=dp[0];for(int i=1;i<nums.size();i++){dp[i]=Max(nums[i]+dp[i-1],nums[i]);if(dp[i]>max){max=dp[i];}}return max;}
private:int Max(int a,int b){return (a>b)?a:b;}
};

5. 零钱兑换

5.1 题目描述

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

你可以认为每种硬币的数量是无限的。

示例 1:输入:coins = [1, 2, 5], amount = 11
输出:3 
解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3
输出:-1示例 3:输入:coins = [1], amount = 0
输出:0示例 4:输入:coins = [1], amount = 1
输出:1示例 5:输入:coins = [1], amount = 2
输出:2

5.2 算法思路

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

5.3 代码实现

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp;for(int i=0;i<=amount;i++){dp.push_back(-1);}dp[0]=0;for(int i=1;i<=amount;i++){for(int j=0;j<coins.size();j++){if(i>=coins[j]&&dp[i-coins[j]]!=-1){if(dp[i]==-1||dp[i]>dp[i-coins[j]]+1){dp[i]=dp[i-coins[j]]+1;}}}}return dp[amount];}
};

6.三角形最小路径和

6.1 题目描述

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。

6.2 算法思路

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

6.3 代码实现

class Solution {
public:int minimumTotal(vector<vector<int>>& triangle) {if(triangle.size()==0){return 0;}vector<vector<int>> dp;for(int i=0;i<triangle.size();i++){dp.push_back(vector<int>(i+1,0));}for(int i=0;i<triangle[triangle.size()-1].size();i++){dp[dp.size()-1][i]=triangle[triangle.size()-1][i];}for(int i=triangle.size()-2;i>=0;i--){for(int j=0;j<triangle[i].size();j++){dp[i][j]=getmin(dp[i+1][j],dp[i+1][j+1])+triangle[i][j];}}return dp[0][0];}
private:int getmin(int a,int b){return a<b?a:b;}
};

7.最长递增子序列

7.1 题目描述

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

7.2 算法思路

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

7.3 代码实现

class Solution {
public:int lengthOfLIS(vector<int>& nums) {if(nums.size()==0){return 0;}int result;vector<int> dp(nums.size(),0);dp[0]=1;int LIS=1;for(int i=1;i<nums.size();i++){dp[i]=1;for(int j=0;j<i;j++){if(nums[i]>nums[j]&&dp[j]+1>dp[i]){dp[i]=dp[j]+1;}}if(LIS<dp[i]){LIS=dp[i];}}return LIS;}
};

8.最小路径和

8.1 题目描述

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 13111 的总和最小。示例 2:输入:grid = [[1,2,3],[4,5,6]]
输出:12

8.2 代码实现

class Solution {
public:int minPathSum(vector<vector<int>>& grid) {if(grid.size()==0){return 0;}vector<vector<int>> dp(grid.size(),vector<int>(grid[0].size(),0));dp[0][0]=grid[0][0];for(int i=1;i<dp[0].size();i++){dp[0][i]=grid[0][i]+dp[0][i-1];}for(int i=1;i<dp.size();i++){dp[i][0]=grid[i][0]+dp[i-1][0];}for(int i=1;i<dp.size();i++){for(int j=1;j<dp[0].size();j++){dp[i][j]=getmin(dp[i-1][j],dp[i][j-1])+grid[i][j];}}return dp[dp.size()-1][dp[0].size()-1];}
private:int getmin(int a,int b){return a<b?a:b;}
};

9.地下城游戏

9.1 题目描述

一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N
个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为
0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

为了尽快到达公主,骑士决定每次只向右或向下移动一步。

编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。

例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7。

9.2 算法思路

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

9.3 代码实现

class Solution {
public:int calculateMinimumHP(vector<vector<int>>& dungeon) {if(dungeon.size()==0){return 1;}int row=dungeon.size();int column=dungeon[0].size();vector<vector<int>> dp(row,vector<int>(column,0));dp[row-1][column-1]=getmax(1,1-dungeon[row-1][column-1]);for(int i=column-2;i>=0;i--){dp[row-1][i]=getmax(1,dp[row-1][i+1]-dungeon[row-1][i]);}for(int i=row-2;i>=0;i--){dp[i][column-1]=getmax(1,dp[i+1][column-1]-dungeon[i][column-1]);}for(int i=row-2;i>=0;i--){for(int j=column-2;j>=0;j--){dp[i][j]=getmin(getmax(1,dp[i+1][j]-dungeon[i][j]),getmax(1,dp[i][j+1]-dungeon[i][j]));}}return dp[0][0];}
private:int getmax(int a,int b){return a>b?a:b;}int getmin(int a,int b){return a<b?a:b;}
};

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

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

相关文章

vue学习笔记-01-前端的发展历史(从后端到前端,再到前后端分离,再到全栈)

vue学习笔记-01-前端的发展历史&#xff08;从后端到前端&#xff0c;再到前后端分离&#xff0c;再到全栈&#xff09; 这篇文章是博主在看vue-前端发展简史的时候做的笔记&#xff0c;以供后续学习复习 文章目录vue学习笔记-01-前端的发展历史&#xff08;从后端到前端&#…

黑客帝国「缸中之脑」有眉目了?培养皿中百万人脑细胞学会打乒乓球,仅用了5分钟...

来源&#xff1a;机器之心编辑&#xff1a;张倩、杜伟既然生物神经元如此高效&#xff0c;为什么不拿来用呢&#xff1f;最新版本的《黑客帝国》还有两天才会上映&#xff0c;但最近的一些科技进展总让我们觉得&#xff0c;导演描述的世界似乎离我们越来越近了。其中一个进展来…

《Science》基因组比对的革命性技术

来源&#xff1a;生物通加州大学圣克鲁斯基因组研究所(UC Santa Cruz Genomics Institute)的研究人员推出了一种名为“长颈鹿”(Giraffe)的新工具&#xff0c;可以有效地将新的基因组序列绘制到代表多种不同人类基因组序列的“泛基因组”(pangenome)上。使用泛基因组学方法而不…

vue学习笔记-02-前端的发展历史浅谈mmvm设计理念

vue学习笔记-02-前端的发展历史浅谈mmvm设计理念 文章目录1. MVVM模式的实现者2.第一个vue程序3.什么是mvvm&#xff1f;4.为什么要用mvvm&#xff1f;5.mvvm的组成部分7.MVVM 模式的实现者8.为什么要使用 Vue.js1. MVVM模式的实现者 Model:模型层&#xff0c;在这里表示JavaSc…

linux——select、poll、epoll

文章目录1.多路I/O转接服务器2.select3.select代码4.poll5.epoll5.1 基础API5.3 epoll代码5.4 边沿触发和水平触发5.4.1 水平出发LT5.4.2 边缘触发5.4.3 服务器的边缘触发和水平触发5.4 边缘触发但是能一次读完6.epoll反应堆模型6.1 反应堆模型6.2 epoll反应堆代码7.心跳包8.线…

年终盘点:2021年中国科技的重大突破

来源&#xff1a;科技日报2021年已经步入尾声&#xff0c;过去的一年是科技界屡创新高、收获满仓的一年。这一年&#xff0c;恰逢中国共产党百年华诞&#xff0c;我国科技界更是取得多项重要突破。量子计算获得重大进展&#xff0c;使我国成为唯一在两个物理体系中实现量子计算…

vue学习笔记-03-浅谈组件-概念,入门,如何用props给组件传值?

vue学习笔记-03-浅谈组件-概念&#xff0c;入门&#xff0c;如何用props给组件传值&#xff1f; 文章目录vue学习笔记-03-浅谈组件-概念&#xff0c;入门&#xff0c;如何用props给组件传值&#xff1f;什么是组件&#xff1f;为什么要使用组件&#xff1f;如何使用组件呢&…

盘点:2021年度物理学十大突破|《物理世界》

来源&#xff1a;物理世界作者&#xff1a;哈米什约翰斯顿&#xff08;Hamish Johnston&#xff09;译者&#xff1a;王晓涛、乔琦2021年12月14日&#xff0c;《物理世界》&#xff08;Physics World&#xff09;编辑从其网站发表的近600项研究进展中评选出了年度物理学领域十大…

Python实现二叉树的遍历

二叉树是有限个元素的集合&#xff0c;该集合或者为空、或者有一个称为根节点&#xff08;root&#xff09;的元素及两个互不相交的、分别被称为左子树和右子树的二叉树组成。 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点)&#xff0c;二叉树的子树有左右之分&#…

操作系统学习笔记-02-1.2-什么是操作系统

1.2什么是操作系统 没有一个完整&#xff0c;精确&#xff0c;公认的定义从功能和特点上来介绍操作系统 用户角度上&#xff0c;操作系统是一个控制软件管理应用程序为应用程序提供服务杀死应用程序 资源管理管理外设&#xff0c;分配资源 操作系统架构层次 硬件之上应用程序之…

大脑活动与认知: 热力学与信息论的联系

来源&#xff1a;集智俱乐部作者&#xff1a;Guillem Collell、Jordi Fauquet译者:张澳审校&#xff1a;刘培源编辑&#xff1a;邓一雪导语信息和能量之间的关系已经在物理学、化学和生物学中得到了广泛的研究。然而&#xff0c;这种联系并没有在神经科学领域形式化。2015年&am…

离散数学学习笔记-01-随机试验与随机事件

文章目录1.1.1随机试验与随机事件引言随机事件1.1.2.样本空间与事件的集合表示基本概念1.1.3事件之间的关系1.包含2.并&#xff08;和&#xff09;引入概率论的三个要素&#xff1a;1.1.1随机试验与随机事件 引言 确定性&#xff08;必然&#xff09;&#xff1a;一定发生&am…

18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED

https://www.cnblogs.com/yangfengwu/p/11112015.html 先规定一下协议 aa 55 02 01 F1 4C 控制LED点亮 F1 4C为CRC高位和低位aa 55 02 00 30 8C 控制LED熄灭 30 8C为CRC高位和低位 aa 55 03 占空比(四字节 高位在前,低位在后) CRC校验高位,CRC校验低位 预留一个问题 我用客…

Ubuntu下的git使用指南

1.创建账号&#xff0c;绑定邮箱 在Git或者Gitee中创建一个Git账号或者Gitee账号&#xff0c;绑定邮箱&#xff0c;Ubuntu下的git命令对Git或者Gitee都有效。 2.安装git Ubuntu下下载git命令&#xff1a; sudo apt-get install git在下载完之后&#xff0c;可以通过git --v…

人类、动物和人工智能意识的新理论

来源&#xff1a;ScienceAI编译&#xff1a;萝卜皮德国波鸿鲁尔大学&#xff08;RUB&#xff09;的两名研究人员提出了一种新的意识理论。他们一直在探索意识的本质&#xff0c;大脑如何产生意识以及在何处产生意识&#xff0c;以及动物、人工智能是否也有意识等问题。新概念将…

ffmpeg——简单播放器代码

1.媒体文件播放总体过程 媒体文件——>解复用——>解码——>调用播放接口——>播放 2.解复用 2.1 什么是解复用&#xff1f; 解复用&#xff1a;将媒体文件分解为视频流和音频流 avformat_open_input() /*打开对应的文件&#xff0c;查找对应的解复用器&…

Nature公布2022年值得关注的七大科学事件, 中国一项入选!

来源&#xff1a;科技日报 记者 刘霞 文中图片来自《自然》杂志官网&#xff0c;版权属于原作者&#xff0c;仅用于学术分享尽管今年新冠疫情仍然肆虐&#xff0c;给人类带来不少悲剧和灾难&#xff0c;但“每朵乌云都镶有金边”&#xff01;新冠疫苗成为抗击疫情的有力武器、…

计算机网络学习笔记-01-概念,组成,功能,分类

计算机网络-2019 王道考研 计算机网络-1-概念&#xff0c;组成&#xff0c;功能&#xff0c;分类 文章目录1.概念&#xff0c;组成&#xff0c;功能&#xff0c;分类1.1概念1.2功能1.3组成部分1.3分类1.4思维导图总结1.概念&#xff0c;组成&#xff0c;功能&#xff0c;分类 …

深度学习如炼丹,你有哪些迷信做法?网友:Random seed=42结果好

来源&#xff1a;机器学习研究组订阅调参的苦与泪&#xff0c;还有那些「迷信的做法」。每个机器学习领域的研究者都会面临调参过程的考验&#xff0c;当往往说来容易做来难。调参的背后往往是通宵达旦的论文研究与 GitHub 查阅&#xff0c;并需要做大量的实验&#xff0c;不仅…

计算机网络学习笔记-02-标准化工作以及相关组织

计算机网络-2019 王道考研 计算机网络-02-标准化工作以及相关组织 文章目录2.标准化工作以及相关组织2.1标准化工作2.2 相关组织2.3思维导图2.标准化工作以及相关组织 2.1标准化工作 标准的分类 法定标准&#xff1a;OSI事实标准&#xff1a;TCP/IP 举例子&#xff1a;手机卡…