动态规划(DP)C++讲解,看着这一本就够了

这篇具有很好参考价值的文章主要介绍了动态规划(DP)C++讲解,看着这一本就够了。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是动态规划

用于求解某种最优性质的问题。

将带求解问题分解为若干个子问题,解决子问题,然后从这些子问题的解得到原问题的解

两个要素:状态和转移。

阶段 :求解的问题的每个过程。

状态 :状态表示每个阶段所处的情况。

策略 :策略是按顺序排列的策略组成的集合。 状态转移方程 ;状态转移方程是确定过程由一个状态到另一个状态的过程。 

什么时候使用动态规划

最优子结构性质:如果问题的最优解所包含的子问题的解也是最优的,那么该问题具有最优子结构性质。(LIS)

子问题重叠性质:子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。(求Fibonacci)

无后效性:对于某个阶段状态,只能由前面的状态转移到,且不可以转移到前面。(对于有负边权求最短路,dijkstra是不可做的)\

动态规划是干什么的

DP常常适用于有重叠子问题和最优子结构性质的问题。

这时候就有许多同学,就开始问了:那他的步骤呢

很简单

设状态 列转移方程

今年普及组的同学注意了

常见动态规划类型有

背包问题

LIS

LCS

括号序列计数

区间DP

树形DP

数位DP

状压DP

概率期望DP

那我们就开始今天的练习

爬楼梯问题

一个人每次只能走1层楼梯或者2层楼梯,问走到第n层楼梯一共有多少种方法。

n<=1000000

数楼梯 - 洛谷https://www.luogu.com.cn/problem/P1255Fibonacci。

设状态:f[i]表示走到第i层的方案数。

列转移方程:

f[i] = f[i-1]+f[i-2]

边界条件:

f[0] = 1, f[1] = 1;

记忆化搜索

复杂度分析(评价一个动态规划算法设计的好坏):

 空间复杂度: 

 转移复杂度:

总复杂度:

疯狂的爬楼梯问题

 一个人每次只能走2层楼梯,22层楼梯,222层楼梯,问走到第n层楼梯一共有多少种方法。

n<=1000000

 那这到题该怎么做呢

设状态:f[i]表示走到第i层的方案数。

列转移方程:

f[i] = f[i-2] + f[i-22] + f[i-222]

边界条件:

f[0] = 1 f[1] = 1

复杂度分析(评价一个动态规划算法设计的好坏):

 空间复杂度:

转移复杂度:

总复杂度:

超级疯狂的爬楼梯问题

一个人每次最少走1层楼梯,最多t层楼梯。

问走到第n层楼梯一共有多少种方法。

n<=1000000

其中有许多层楼梯上会有石头,求最少经过多少石头到达n层。 比如第1层有2个石头,第2层有10个石头,第3层有2个石头,每次最多走两层。

那么显然0-1-3只需要经过4个石头

n<=1000000

设状态:f[i]表示到第i层最少经过多少石头。

列转移方程 如果i处没有有石头

 f[i] = min(f[i – 1], f[i – 2] … f[i-k])

如果i处有石头

f[i] = min(f[i-k]) + a[i]

(a[i]为第i层的石头)

复杂度:

空间:

转移:

总复杂度:

LIS 最长上升子序列

给出一个序列,求出最长的不下降子序列的长度

n<=1000

2,7,3,4,8,5 2,3,4,5

answer = 4

2533 -- Longest Ordered Subsequencehttp://poj.org/problem?id=2533[NOIP2004 提高组] 合唱队形 - 洛谷https://www.luogu.com.cn/problem/P1091

LIS 解法

设状态:f[i]表示到第i个位置的最长上升子序列。

列转移方程:

f[i] = max(f[j])+1,   j<=i且h[i]>h[j]

复杂度:

空间:

转移:  

总复杂度:

LIS nlogn解法

g[i]表示所有长度为i的最长上升子序列中,末尾元素最小的是多少。

g[i]是递增的。 那么对于第i个数x,在g数组中找到第一个小于它的数就好了。

即g[j]<=x的最大的j(也就是x能够正好插入的位置) 令g[j+1]=min(g[j+1],x);

二分查找优化,复杂度为

LIS 合唱队形

[NOIP2004 提高组] 合唱队形 - 洛谷https://www.luogu.com.cn/problem/P1091文章来源地址https://www.toymoban.com/news/detail-472885.html

求一遍最长上升子序列和最长下降子序列,扫一遍统计答案。

到了这里,关于动态规划(DP)C++讲解,看着这一本就够了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么?你还不知道什么是C++ 预处理器?看这一篇就够了~

    目录 C++ 预处理器 #define 预处理 参数宏 条件编译 # 和 ## 运算符

    2024年02月07日
    浏览(45)
  • 动态规划-简单了解下什么是期望DP

    首先说明下为啥是简单了解下,因为对于期望DP的问题 ,相较于一般的动态规划问题,可以说期望DP的题目相对较少,并且往往具有一定的难度。这是因为期望DP在解决问题时需要考虑状态的期望值,涉及到概率和随机性的计算,因此可能需要运用更多的数学知识和技巧 ,所

    2024年02月22日
    浏览(36)
  • c++ 算法之动态规划—— dp 详解

    dp 是 c++ 之中一个简单而重要的算法,每一个 OIer 必备的基础算法,你知道它究竟是什么吗? 目录 一、简介         1.为什么不能贪心?         2.揭秘 dp   二、应用         1.定义         2.边界值         3.动态转移方程         4.结果         5.代码

    2024年04月09日
    浏览(46)
  • C++ 动态规划 数位统计DP 计数问题

    给定两个整数 a 和 b ,求 a 和 b 之间的所有数字中 0∼9 的出现次数。 例如,a=1024,b=1032 ,则 a 和 b 之间共有 9 个数如下: 1024 1025 1026 1027 1028 1029 1030 1031 1032 其中 0 出现 10 次,1 出现 10 次,2 出现 7 次,3 出现 3 次等等… 输入格式 输入包含多组测试数据。 每组测试数据占一

    2024年02月20日
    浏览(40)
  • 动态规划:两个数组的dp问题(C++)

    动态规划往期文章: 动态规划入门:斐波那契数列模型以及多状态 动态规划:路径和子数组问题 动态规划:子序列问题 动态规划:回文串问题 1.最长公共子序列(中等) 链接 :最长公共子序列 题目描述 做题步骤 状态表示 对于两个数组的dp,采用一维dp是没有办法清晰的表

    2024年02月08日
    浏览(49)
  • C++算法 —— 动态规划(7)两个数组的dp

    每一种算法都最好看完第一篇再去找要看的博客,因为这样会帮你梳理好思路,看接下来的博客也就更轻松了。当然,我也会尽量在写每一篇时都可以不懂这个算法的人也能边看边理解。 动规的思路有五个步骤,且最好画图来理解细节,不要怕麻烦。当你开始画图,仔细阅读

    2024年02月07日
    浏览(52)
  • C++ 动态规划 状态压缩DP 最短Hamilton路径

    给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。 Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。 输入格式 第一行输入整数 n 。 接下来 n 行每行 n 个整数,其中第 i 行第 j 个整数表示点 i 到 j 的距离(记为 a[

    2024年02月19日
    浏览(38)
  • C++ DP算法,动态规划——背包问题(背包九讲)

    有N件物品和一个容量为 V V V 的背包。放入第i件物品耗费的空间是 C i C_i C i ​ ,得到的价值是 W i W_i W i ​ 。 求解将哪些物品装入背包可使价值总和最大。 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。 用子问题定义状态:即 F [ i , v ] F[i, v] F

    2024年02月16日
    浏览(49)
  • 【图论C++】树的直径(DFS 与 DP动态规划)

    UpData Log👆 2023.9.27 更新进行中 Statement0🥇 一起进步 Statement1💯 有些描述是个人理解,可能不够标准,但能达其意 21-1-1 定义 树上 最远的两个节点之间 的距离被称为 树的直径 ,连接这两个点的路径 被称为 树的最长链 。 21-1-2 性质 1 、这两个最远点一定是叶子节点 1、这 两

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包