一文彻底弄懂动态规划【DP】

在这里插入图片描述

动态规划是一种重要的算法,它能解决很多看似复杂的问题,关键在于找到问题的子问题结构,并根据子问题的解决方式来解决原问题。首先要了解的是动态规划的基本思想:

动态规划的基本思想是:将一个复杂的问题分解为一系列相关的子问题,每个子问题只解决一次,并将结果储存在一个可以查找的数据结构中(通常是一个数组或表格)。当要解决相同的子问题时,不需要重新计算,而是可以直接从表格中获取已经计算过的结果。这种使用了额外的存储空间来节省计算时间的方法,常被称为空间换时间。动态规划关键在于如何定义子问题和状态,如何寻找和计算状态转移。

动态规划主要包含三个步骤:

  • 定义状态:状态可以看做是原问题的子问题,通常是对应的一个或多个变量。例如,在背包问题中,状态就是当前放入背包的物品的总价值。

  • 状态转移方程:状态转移方程描述了状态之间的关系。例如,在背包问题中,当前的总价值可以由之前的物品价值和当前物品的价值得出。

  • 初始化和边界条件:动态规划解决问题时,需要一个初始状态作为问题的起点,并在问题解决的过程中处理好边界条件。

下面介绍五个经典的动态规划问题,以及它们的解决思路和代码表示:

  1. 斐波那契数列

这是最简单的动态规划问题,它描述的是一种特殊的数列:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2) (n>=2),要求出第n项的数值。

解题思路:假设dp[i]表示第i个斐波那契数,状态转移方程为dp[i] = dp[i-1] + dp[i-2]

vector<int> fib(int N) {vector<int> dp(N+1, 0);dp[0] = 0; // 初始化dp[1] = 1; // 初始化for(int i = 2; i <= N; i++){dp[i] = dp[i-1] + dp[i-2]; // 状态转移方程}return dp[N];
}
  1. 凑零钱问题

这是一种找零问题,给定不同面额的硬币和一个总金额,每种硬币的数量无限,求出能拼凑出总金额所需的最少的硬币个数。

解题思路:假设dp[i]表示拼出金额i所需的最少硬币个数,状态转移方程为dp[i] = min(dp[i], dp[i-coin]+1)其中coin为所有硬币面额。

int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, amount + 1);dp[0] = 0;for (int i = 1; i <= amount; i++) {for (int coin : coins) {if (coin <= i) {dp[i] = min(dp[i], dp[i - coin] + 1);}}}return dp[amount] > amount ? -1 : dp[amount];
}
  1. 最长公共子序列

给出两个字符串,求出他们的最长公共子序列的长度。

解题思路:假设dp[i][j]表示字符串1的前i个字符和字符串2的前j个字符的最长公共子序列的长度,当str1[i]==str2[j]时,dp[i][j]等于dp[i-1][j-1]+1,否则等于max(dp[i-1][j], dp[i][j-1])

int longestCommonSubsequence(string text1, string text2) {int m = text1.length(), n = text2.length();vector<vector<int>> dp(m+1, vector<int>(n+1, 0));for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){if(text1[i-1] == text2[j-1]){dp[i][j] = dp[i-1][j-1] + 1;}else{dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}}return dp[m][n];
}
  1. 0-1背包问题

这是一种很经典的动态规划问题,给定一组物品的重量和价值,一个能承受最大重量的背包,求出能装入背包的物品的最大价值。

解题思路:假设dp[i][j]表示前i个物品重量不超过j的最大价值,状态转移方程为dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i])

int knapsack(vector<int>& weight, vector<int>& value, int W) {int n = weight.size();vector<vector<int>> dp(n+1, vector<int>(W+1, 0));for(int i = 1; i <= n; i++){for(int j = W; j >= 1; j--){if(j >= weight[i-1]){dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i-1]] + value[i-1]);}else{dp[i][j] = dp[i-1][j];}}}return dp[n][W];
}
  1. 最长递增子序列

给出一个无序的整数数组,求出它的最长递增子序列的长度。

解题思路:假设dp[i]表示以第i个数字结尾的最长上升子序列长度,状态转移方程为dp[i] = max(dp[i], dp[j] + 1)(对所有0<=j<i,如果nums[i]>nums[j])。

int lengthOfLIS(vector<int>& nums) {if (nums.empty())return 0;vector<int> dp(nums.size(), 1);int res = 1;for (int i = 1; i < nums.size(); ++i) {for (int j = 0; j < i; ++j) {if (nums[j] < nums[i]) {dp[i] = max(dp[i], dp[j] + 1);}}res = max(res, dp[i]);}return res;
}

如果你想更深入地了解人工智能的其他方面,比如机器学习、深度学习、自然语言处理等等,也可以点击这个链接,我按照如下图所示的学习路线为大家整理了100多G的学习资源,基本涵盖了人工智能学习的所有内容,包括了目前人工智能领域最新顶会论文合集和丰富详细的项目实战资料,可以帮助你入门和进阶。

链接: 人工智能交流群【最新顶会与项目实战】(点击跳转)

在这里插入图片描述

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

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

相关文章

深层神经网络(第四周)

这里省略了深层神经网络的前向传播和反向传播&#xff0c;内容和之前相似&#xff0c;不做过多描述。若今后需要&#xff0c;可以再补习。 一、为什么使用深层表示 解决问题时其实并不需要很大的神经网络&#xff0c;但是得有深度&#xff0c;得有比较多的隐藏层。这是为什么…

字符串转换整数

字符串转换整数 描述 : 请你来实现一个 myAtoi(string s) 函数&#xff0c;使其能将字符串转换成一个 32 位有符号整数&#xff08;类似 C/C 中的 atoi 函数&#xff09;。 函数 myAtoi(string s) 的算法如下&#xff1a; 读入字符串并丢弃无用的前导空格检查下一个字符&am…

select选择框里填充图片,下拉选项带图片

遇到一个需求&#xff0c;选择下拉框选取图标&#xff0c;填充到框里 1、效果展示 2、代码 <el-form-item label"工种图标" class"Form_icon Form_label"><el-select ref"select" :value"formLabelAlign.icon" placeholder&…

Python第三方库版本管理(管理虚拟环境)

序言 最近使用python发现会有使用不同项目时需要的三方包依赖版本不同&#xff0c;如果各个项目相互切换&#xff0c;那么会经常需要更新版本。比如numpy当前版本时1.26.2&#xff0c;需要它小于版本1.21&#xff0c;有没有像Java一样通过Maven依赖管理中的版本控制去管理这些…

Redis--12--Redis分布式锁的实现

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Redis分布式锁最简单的实现如何避免死锁&#xff1f;锁被别人释放怎么办&#xff1f;锁过期时间不好评估怎么办&#xff1f;--看门狗分布式锁加入看门狗 redissonRe…

Windows :VSCode安装和运行Django

创建Django项目 打开VSCode&#xff0c;如果没有安装Python扩展先安装Python扩展插件。安装Django&#xff1a;在VSCode终端使用pip安装:pip install django 创建Django项目&#xff1a;在VSCode终端输入&#xff1a;django-admin startproject firstproject 创建虚拟环境&…

什么是跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;通常称为XSS&#xff09;&#xff0c;是一种典型的Web程序漏洞利用攻击&#xff0c;在线论坛、博客、留言板等共享…

数据结构和算法-线索二叉树中的线索化和在线索二叉树中找前驱后继

线索二叉树的概念 找到某个节点得按照遍历得到的序列开始遍历才能遍历全部节点&#xff0c;非常繁琐 中序线索二叉树 线索二叉树的存储结构 先序线索二叉树 后序线索二叉树 三种线索二叉树的对比 即对应前驱后后继判断标准不同 小结 二叉树的线索化 用土办法找中序前驱 当…

UniGUI Session管理說明

UniGUI Session管理說明 每一個Session對應一個UniMainModule,一個MainForm 因此SessionUniMainModule就可以得到所有Session使用者的資料 以做管理之用 [UniServerModule] Public區定義 UserList:TList; //登入Session List //事件 procedure TUniServerModule.…

Prefix-Tuning 论文概述

Prefix-Tuning 论文概述 前缀调优&#xff1a;优化生成的连续提示前言摘要论文十问实验数据集模型实验结论摘要任务泛化性能 前缀调优&#xff1a;优化生成的连续提示 前言 大规模预训练语言模型(PLM)在下游自然语言生成任务中广泛采用fine-tuning的方法进行adaptation。但是f…

android studio安装SDK时无法勾选

这两天帮助学妹安装android studio安装SDK时无法勾选&#xff0c;记录一下最终解决办法。头大。 核心 360 问题 网上所有方法都尝试了包括挂梯子&#xff0c;改hosts&#xff0c;盘符权限等等。 最终解决下载360 使用这两个&#xff0c;DNS注意要用8.8.8.8的 成功解决

超硬核解析Mybatis动态代理原理!只有接口没实现也能跑?

文章目录 前言Mybatis dao层两种实现方式的对比原始Dao开发原始Dao开发的弊端 基于Mapper动态代理的开发方式 Mybatis动态代理实现方式的原理解析动态代理调用链路解析先给出链路调用结果1、调用方法的开始&#xff1a;session.getMapper2、DeaultSqlSession的getMapper3、Conf…

Selenium自动化测试:通过cookie绕过验证码的操作

验证码的处理 对于web应用&#xff0c;很多地方比如登录、发帖都需要输入验证码&#xff0c;类型也多种多样&#xff1b;登录/核心操作过程中&#xff0c;系统会产生随机的验证码图片&#xff0c;进行验证才能进行后续操作 ​解决验证码的方法如下&#xff1a; 1、开发做个万…

西瓜书-主要符号表

主要符号表 LaTeX符号说明How to read letter?\mathit{x}标量\boldsymbol{x}向量\mathrm{x}变量集\mathbf{A}矩阵\mathbf{I}单位阵\mathcal{X}样本空间或状态空间calligraphic X\mathcal{D}概率分布Ɗ calligraphic D\mathit{H}数据样本&#xff08;数据集)\mathcal{H}假设空…

基于OpenCV的手势1~5识别系统(源码&环境部署)

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义&#xff1a; 随着计算机视觉技术的快速发展&#xff0c;手势识别系统在人机交互、虚拟现实、智能监控等领域得到了广泛应用。手势识别系统可以通过分析人体的手势…

LTO编译器优化介绍以及开启方法

文章目录 LTO介绍LTO 开启方法 LTO介绍 LTO&#xff08;Link Time Optimization&#xff0c;链接时优化&#xff09;是一种在链接阶段进行优化的技术。传统的编译过程中&#xff0c;编译器仅能对单个编译单元进行优化。LTO 允许编译器看到跨编译单元的代码&#xff0c;从而进行…

jquery 判断是手机端还是电脑端

判断为手机端&#xff1a; var sUserAgent navigator.userAgent.toLowerCase(); var bIsIpad sUserAgent.match(/ipad/i) "ipad"; var bIsIphoneOs sUserAgent.match(/iphone os/i) "iphone os"; var bIsMidp sUserAgent.match(/midp/i) "mid…

药物副作用预测网络---------数据处理(1)

1.筛选需求的报告id 基于REAC14Q4文件,筛选出需求报告的id,该文件格式如下&#xff0c;其中pt字段描述了患者在事件中所有的不良信息&#xff0c;注意此处一个报告id可以对应复数条信息。 primaryid$caseid$pt$drug_rec_act 初步统计约有4500种不良反应&#xff0c;总计60W条数…

【九日集训】第八天:二级指针

二级指针顾名思义就是指针又嵌套了一个指针&#xff1b; 常用的变量是这样的int p 1; 一级指针指向该变量 int * p1 &p; 二级指针指向一级指针 int ** p2 &p1; 解引用方法&#xff1a; 一级指针解引用是变量 int x * p1; 二级指针解引用是一级指针 int * x1 *p2;…

【开源】基于Vue和SpringBoot的快递管理系统

项目编号&#xff1a; S 007 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S007&#xff0c;文末获取源码。} 项目编号&#xff1a;S007&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快…