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

文章目录

    • 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;导演描述的世界似乎离我们越来越近了。其中一个进展来…

面试题——面经题目(1)

文章目录1. 进程调度算法2.操作系统在调度线程时会做哪些事情3.页面置换算法4.32位系统,64位的系统内存是多大5.CPU的GHz是什么意思1. 进程调度算法 进程调度规定了CPU执行就绪队列中的多个进程的顺序。 1.先来先服务 &#xff08;FCFS&#xff0c;first come first served&…

去掉input密码框自动补全功能

<input name"password" autocomplete"off" hidden> <input type"password" autocomplete"off"> //不能加id 转载于:https://www.cnblogs.com/yuyedaocao/p/11124653.html

《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;如何使用组件呢&…

iscsi-分区类型

iSCSI简介(Internet SCSI)&#xff1a; iSCSI 小型计算机系统接口&#xff0c;IBM公司研发&#xff0c;用于在IP网络上运行SCSI协议&#xff1b;解决了 SCSI需要直连存储设备的局限性&#xff1b;可以不停机扩展存储容量&#xff0c;iSCSI 将 SCSI 接口与 Ethernet 技术结合&am…

设计模式1——设计模式的原则

1.从面向对象说起 ~~~~~~变化是代码复用的天敌&#xff0c;面向对象的设计语言的优势就是抵御变化&#xff01;这里的所谓抵御变化&#xff0c;不是说采用面向对象的设计语言&#xff0c;就没有变化&#xff0c;而是将变化的范围降到最小。 ~~~~~~之前我们所认识的面向对象的语…

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

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

操作系统学习笔记-01-1.1课程概述

此课程来自于b站操作系统_清华大学(向勇、陈渝)&#xff0c;博客作为博主手打&#xff0c;当作参考笔记&#xff0c;回头复习223 1.1课程概述 课程简介 什么是操作系统 为什么学习以及如何学习操作系统 操作系统的实例&#xff0c;历史和结构介绍 基本概念及原理 操作系统…

Python实现二叉树的遍历

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

tdms打开闪退问题

问题&#xff1a;tdms打开闪退 解决方法如下&#xff0c;打开excel&#xff0c;在菜单栏中点【文件】 左下方进入【选项】&#xff0c;然后在excel选项中点击【加载项】 然后在下方的管理&#xff0c;选择【COM加载项】&#xff0c;点击【转到】 将NI的TDMS【Add-in】的打勾&a…

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

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

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

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

我为能准时下班而做的准备,以及由此的收获,同时总结下不足

可能有人会说&#xff0c;做IT的想准时下班很难&#xff0c;尤其是在互联网公司。有些外企或国企倒能准时下班&#xff0c;原因是公司更像养老院。 其实这里存在个误区&#xff1a;能否准时下班其实和工作效率和质量有关&#xff0c;取决于自己&#xff0c;而不在于其它因素。公…

Ubuntu下进行截图的快捷方式

shiftFnPRT SC 截图结果保存在用户下的相册中

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

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