【刷题版】掌握算法的一揽子计划——动态规划总结
创始人
2025-05-30 22:26:08
0

动态规划是一种通过将原问题分解为相对简单的子问题来求解,然后将子问题的解存储起来避免之后重复计算,并最终将子问题组合成原问题的解决方法。动态规划并不算是一种具体的算法,更应该被认为是一种解决问题的思想。

动态规划通常适用于具有重叠子问题和最优子结构性质的问题。具有重叠子问题的问题意味着在解决问题的过程中,我们需要解决相同的子问题。而最优子结构性质意味着问题的最优解可以通过其子问题的最优解来计算。

能用动态规划解决的问题,需要满足三个条件:最优子结构,无后效性和子问题重叠。

  • 最优子结构:假设问题的最优解所包括的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。
  • 无后效性:即某阶段状态一旦确定。就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响曾经的状态。仅仅与当前状态有关。
  • 子问题重叠:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到(该性质并非动态规划适用的必要条件,可是假设没有这条性质。动态规划算法同其它算法相比就不具备优势)。

动态规划算法的具体实现方法有多种,例如自顶向下的记忆化搜索和自底向上的迭代算法。在实际应用中,动态规划可以用来解决一些经典问题,如最长公共子序列问题、背包问题和图的最短路径问题等。

本文主要举一些简单和常见的例子。

线性 DP

线性DP是动态规划问题中的一类问题,指状态之间有线性关系的动态规划问题。也可以是多维的线性问题。

常见问题:

  • 数字金字塔
  • 最长上升子序列
  • 最长不下降子序列
    • 与上一题相比,需要输出一个符合条件的解,可以用一个额外的数组记录以每一个元素结尾时该元素所对应的最长不下降子序列的长度,然后逆序遍历每一个元素,记录符合条件的数据。浅浅贴一个代码 ↓\downarrow↓
#include 
using namespace std;const int N = 200 + 5;
// dp 保存第 i 个数字结尾的子序列的长度
// sc 保存原始数据
// tp 保存临时序列
int dp[N], sc[N], tp[N];// 从 s 到 e 搜索 第一个 大于 tar 的元素的下标
int bin_search(const int * nums, int s, int e, int tar) {if (s > e) return 0;int l = s, r = e;while (l <= r) {int mid = (l + r) >> 1;if (nums[mid] <= tar)l = mid + 1;elser = mid - 1;}return l;
}int main() {int n;cin >> n;int idx = 0;for (int i = 0; i < n; ++i) {scanf("%d", &sc[i]);int k = bin_search(tp, 0, idx - 1, sc[i]);if (k == idx) {tp[idx++] = sc[i];} else {tp[k] = sc[i];}dp[i] = k + 1;}cout << "max=" << idx << endl;int ans[idx + 5], len = idx;for (int i = n - 1; i >= 0; --i) {if (dp[i] == len)ans[len--] = sc[i];}for (int i = 1; i <= idx; ++i) {printf("%d ", ans[i]);}
}
  • 一个应用:导弹拦截
    • 在这个问题中,第一问求,最多可以拦截的导弹数,按题意,每一发炮弹都不能高于前一发的高度,此处只需要求一个最长不上升子序列就好了
    • 第二问中,求最少需要多少套设备,正常想最少需要,那么我们可以每套设备尽可能拦截多的导弹,直至全部拦截完为止,但若求多次最长不上升子序列很麻烦。这有一个 trick 是,我们可以发现按最初的求法,每次求出的序列和之前的序列一定会有一个上升的过程,不然就可以归到前一个子序列里边了。所以第二问的解就是同时求一个最长严格上升子序列即可。
  • 最长公共子序列
  • 最大子序和
  • 最大上升子序和
  • 编辑距离

背包问题

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。这个问题直接看背包九讲就好了

常见问题:

  • 01背包
  • 完全背包
  • 混合背包
  • 分组背包
  • 货币系统
    • 相当于 m 大小的背包,n 种物品
  • 数字组合
  • 装箱问题
    • 将体积也看成价值也就是求可以装下的最大价值

参考资料

  • https://oi-wiki.org/dp
  • https://blog.csdn.net/qq_38670588/article/details/108186884
  • https://baike.baidu.com/item/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98/2416931?fr=aladdin

相关内容

热门资讯

最新或2023(历届)关于开学...   1.《开学第一课》英雄不朽观后感  最新或2023(历届)9月4日,中央一台播放了由中华人民共和...
最新或2023(历届)开学第一...   《开学第一课》观后感1  今天晚上,我和爸爸妈妈怀着激动的心情,准时收看了《开学第一课》。今年是...
最新或2023(历届)开学第一...   第1篇:开学第一课英雄不朽观后感  今天,我看了开学第一课《英雄不朽》。  开学第一课一共有四节...
最新或2023(历届)开学第一...  1.英雄不朽观后感400字作文  我看了9月4日中央1套的《开学第一课》,知道了从1937年上海因...
最新或2023(历届)开学第一...   1.英雄不朽观后感作文300字  我看了9月4日中央1套的《开学第一课》,知道了从1937年上海...
超实用!!! 三分钟将你的项目... 文章目录前言一、在项目中新增配置二、配置github page setting?三、如...
Deep Learning a... 文章目录一、Deep learning attracts lots of attention.Ups...
【读论文】PIAFusion 【读论文】PIAFusion介绍网络架构光照感知网络特征提取CNN部分CMDAF图像还原损失函数总结...
中小学生安全教育专题广播稿 中...   广播稿1:  亲爱的同学们:大家好!今天是一个特殊的日子,是第16个全国中小学生安全教育日。  ...
关于运动的校园广播稿 关于体育...   《运动与健康》校园广播稿【1】  男:彩旗飘飘如一片彩色的海洋。让人欢欣鼓舞。衷心祝愿我们的运动...
公司国庆晚会主持词 公司国庆晚...  编者导语:国庆晚会是每个单位和学校都十分重视的,因为这是为了庆祝中华人民共和国的建立,人们牢记着几...
公司庆国庆晚会活动主持词 公司... 【小编导语】国庆晚会是全国各地为了庆祝国庆节的带来而举行的一场以爱国为主题的晚会。在晚会上人们载歌载...
开学第一课观看英雄不朽的观后感...  第1篇:《开学第一课之英雄不朽》观后感  在举国欢庆抗日战争既反法西斯战争胜利70周年这个盛大节日...
关于拼搏的短篇校园广播稿 关于...  《拼搏》  拼搏,正是勇于拼搏,不断超越的精神才产生了运动的风采,才让运动变的更加精彩,更加吸引。...
关于中国梦校园广播稿 中国梦我...   【篇1】  各位同学:  下面给大家播放一组“中国梦”广播稿。近年来,我们的一个个梦想成为现实,...
校园广播稿《中国梦我的梦》 我... 【广播稿一】  合:老师们、同学们,大家好!我们本期广播的主题是——我的梦,中国梦!  甲:梦想是什...
成功主题校园广播稿 成功主题校...  《成功属于那些有准备的人》  合:亲爱的老师,同学们:大家下午好!  甲:这一期的红领巾广播又和大...
关于读书的校园广播稿 关于读书...   【广播稿1】  男:给你的天空划一道绚丽的亮色。  女:给你的世界奏一曲动听的欢歌。  合:尊敬...
QT新增自定义控件类并在QT ... 一、新增自定义子类并在QT Designer中将系统父类修改掉 qt中经常会遇到系统提供的UI控件类...
勤奋学习小学校园广播稿 小学生...   广播稿一:  尊敬的各位老师,亲爱的同学们:  当我们的身边还荡漾着新年喜庆的时候,新的学期已早...