C++ 动态规划 DP教程 (一)思考过程(*/ω\*)

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

动态规划是一种思维方法,大家首先要做的就是接受这种思维方法,认同他,然后再去运用它解决新问题。

动态规划是用递推的思路去解决问题。

首先确定问题做一件什么事情?

对这件事情分步完成,分成很多步。 如果我们把整件事称为原问题,那么原问题去掉最后一步后,剩下的问题就称为子问题。 子问题和原问题是同性质的问题,子问题被原问题包含,原问题是在子问题的基础上推进一步得到的,所以用递推去求解。 子问题推进一步,得到原问题。哪些量在变化。这些变化的量用变量表示出来就是问题的状态。 子问题推进一步,这一步做了什么,就是决策。每一步的决策连续起来,就是做整件事的一个方案。

我们来看一道例题吧!ヾ(o・ω・)ノ

例1:组合问题,从n个不同物体中选择m个,求有多少种选择方案。 思考过程: 1、 题目要我们做一件什么事情? 答:选物体,确切的说是要我们从n个物体中选出m个物体。n和m尽管不知道是多少,但是肯定是一个确定的值,由输入数据确定,所以我们可以假设n=10,m=5,问题是要我们从10个物体中选出5个物体

2、 这件事分多少步去完成? 答:分10步完成,第一步考虑第一个物体选还是不选,第二步考虑第二个物体选还是不选,……,第10步考虑第10个物体选还是不选?

3、 原问题是什么?子问题是什么? 答: 整个问题是:从10个不同物体中选择5个。最后一步是确定第10个物体选还是不选。 如果第10个物体选了,那么去掉这一步,前9步还需要选择4个物体,所以剩下的子问题是从9个物体中选取4个。 如果第10个物体没有选,那么去掉这一步,在前9步还需要选择5个物体,所以剩下的子问题是从9个物体中选取5个。 原问题是10个中选5个,子问题是9个中选4个、9个中选5个

4、 子问题和原问题是同一个性质的问题,用数学符号描述这个问题,需要几个变量才能体系原问题和子问题的差异,各自表示什么含义? 答:原问题和子问题中,备选物体的规模在变化,选出来的物体数目在变化,所以用两个变量来表示问题变化的量:a表示备选物体的数目,b表示选出的物体数目,f(a,b)整个符号的含义就是从a个不同物体中选取b个物体的方案数,这里的f就是表示求解目标,方案数。 很显然,当a取值10,b取值5时,f(10,5)表示原问题,f(9,5)、f(9,4)表示子问题。用问题和子问题都是用同一个模式来表示,这就是状态。

5、 有了状态,我们就可以寻找子问题和原问题之间的递推关系了。 答: 原问题去掉最后一步,得到的子问题,寻找二者之间的关系。 f(a,b)表示从a个不同物体中选取b个,得到的方案数。 对最后一步分两种情况讨论: 选取第a个物体,则方案数等价于从剩下的a-1个物体中选取b-1个,即f(a-1,b-1) 不选第a个物体,则方案数等价于从剩下的a-1个物体中选取b个,即f(a-1,b) 所以得到一个递推方程:f[a,b]=f[a-1,b-1]+f[a-1,b]

6、 状态在计算机中用数组表示,数组第一维下标表示第一个变量,第二维下标表示第二个变量。则一个状态对应一个数组元素,状态之间递推等价于给数组元素递推赋值。

好了看前面的文章,你应该知道了如何思考动态规划的题目!

但是一道题是不够的,要做很多道题,你才能彻底的理解动态规

划的解题思路,从而得到方程,写出代码!ヽ(・ω・´メ)

话不多说,我们再来看一道题目吧!

【洛谷】P1255 数数梯

原题地址:https://www.luogu.org/problem/P1255

C++ 动态规划 DP教程 (一)思考过程(*/ω\*),动态规划DP,c++,动态规划

思路: 这个题目隐藏深一些。 题目要我们求等式的个数,我们可以穷举等号右边的和数,如果我们把数列从小到大排列,这样等号左边的数就全部位于穷举的数的左边(想不明白为什么需要排序,暂时可以放一放,假设数列就是已经排好序的)。 对于每个穷举的合数,我们目标是寻找在他左边有多少个合法的式子的和等于他。 思考过程: 1、 题目要我们做一件什么事情? 答:求所有的数学式子,确切的说,当我们穷举第i个和数时,是要我们从i-1个数中选出若干个数,使得这些数的和是a[i]。i是穷举的,是定值。 2、这件事分多少步去完成? 答:分i-1步完成,第一步考虑第一个数选还是不选,第二步考虑第二个数选还是不选,……,第i-1步考虑第i-1个数选还是不选? 3、原问题是什么?子问题是什么? 答: 整个问题是:从i-1个数中选择若干个,使得总和是a[i]。最后一步是确定第i-1个数选还是不选。 如果第i-1个数选了,那么去掉这一步,前i-2步还需要选择若干个数,使得和为a[i]-a[i-1],所以剩下的子问题是从i-2个数中选若干个,使得总和是a[i]-a[i-1]。 如果第i-1个物体没有选,那么去掉这一步,在前i-2步还需要选择若干个数使得总和为a[i],所以剩下的子问题是从i-2个数中选若干个,使得总和是a[i]。 原问题是从i-1个数中选择若干个,使得总和是a[i]。子问题是从i-2个数中选若干个,使得总和是a[i]-a[i-1];i-2个数中选若干个,使得总和是a[i]。 4、子问题和原问题是同一个性质的问题,用数学符号描述这个问题,需要几个变量才能体系原问题和子问题的差异,各自表示什么含义? 答:原问题和子问题中,备选数的规模在变化,选出来的和在变化,所以用两个变量来表示问题变化的量:x表示备选物体的数目,y表示选出的物体数目,f(x,y)整个符号的含义就是从x个数中选若干个使得总和为y的方案数,这里的f就是表示求解目标,方案数。 很显然,当x取值i-1,y取值a[i]时,f(i-1,a[i])表示原问题,f(i-2,a[i]-a[i-1])、f(i-2,a[i])表示子问题。用问题和子问题都是用同一个模式来表示,这就是状态。 5、有了状态,我们就可以寻找子问题和原问题之间的递推关系了。 答: 原问题去掉最后一步,得到的子问题,寻找二者之间的关系。 f(x,y)表示从x个数中选若干个使得和为y,得到的方案数。 对最后一步分两种情况讨论: 选取第x个数,则方案数等价于从剩下的x-1个数中选若干个使得和为y-a[x],即f(x-1,y-a[x]) 不选第x个数,则方案数等价于从剩下的x-1个数中选若干个使得和为y,即f(x-1,y) 所以得到一个递推方程:f[x,y]=f[x-1,y-a[x]]+f[x-1,y] 使用该递推方程,可以求每一个阶段的状态 6、状态在计算机中用数组表示,数组第一维下标表示第一个变量,第二维下标表示第二个变量。则一个状态对应一个数组元素,状态之间递推等价于给数组元素递推赋值。  

好了,本篇文章就结束了,如果喜欢就记得三连哦φ(>ω<*) ,记得多多做题哦,bye!ヾ(o・ω・)ノ

文章来源地址https://www.toymoban.com/news/detail-713846.html

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

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

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

相关文章

  • 动态规划:两个数组的dp问题(C++)

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

    2024年02月08日
    浏览(35)
  • 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日
    浏览(31)
  • C++算法 —— 动态规划(7)两个数组的dp

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

    2024年02月07日
    浏览(44)
  • 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日
    浏览(30)
  • 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日
    浏览(37)
  • 【动态规划】【 矩阵】【逆向思考】C++算法174地下城游戏

    视频算法专题 动态规划汇总 矩阵 逆向思考 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数

    2024年02月03日
    浏览(39)
  • 动态规划(DP)C++讲解,看着这一本就够了

    用于求解某种最优性质的问题。 将带求解问题分解为若干个子问题,解决子问题,然后从这些子问题的解得到原问题的解 两个要素:状态和转移。 阶段 :求解的问题的每个过程。 状态 :状态表示每个阶段所处的情况。 策略 :策略是按顺序排列的策略组成的集合。 状态转

    2024年02月08日
    浏览(26)
  • 【数位dp】【动态规划】C++算法:233.数字 1 的个数

    视频算法专题 动态规划汇总 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1: 输入:n = 13 输出:6 示例 2: 输入:n = 0 输出:0 提示: 0 = n = 10 9 本题比较简单,主要讲封装类。m_vPre记录上一位所有状态,程序结束时,记录的是最后一位的所有

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

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

    2024年02月07日
    浏览(34)
  • 「算法小记」-2:矩阵链相乘的方案数【迭代/递归/动态规划/区域化DP/记忆化搜索】(C++ )

    😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文收录于洲洲的《算法小记》系列专栏,该专栏记录了许

    2024年02月05日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包