c++ 算法之动态规划—— dp 详解

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

dp 是 c++ 之中一个简单而重要的算法,每一个 OIer 必备的基础算法,你知道它究竟是什么吗?

目录

一、简介

        1.为什么不能贪心?

        2.揭秘 dp  

二、应用

        1.定义

        2.边界值

        3.动态转移方程

        4.结果

        5.代码

一、简介

        1.为什么不能贪心?

    贪心简单而已理解,但为什么许多程序都不能贪心呢?因为贪心是求局部的最优解,非整体最优解!举个栗子:

    你玩了一个吃豆游戏,这个游戏只能前进,不能后退,但有许多岔路,你随时都能看到整张地图。按照贪心,你会不管后面的路段(即从这个路口到下个路口的路),选择一个豆最多路段走。 但如果有一个路口有两条路,第一条路段上有一个豆,沿着他继续走,后面就是终点了。而第二条路段上,虽然一个豆也没有 但后面任何一条岔路都至少有两个豆:

c++ 算法之动态规划—— dp 详解,c++ 算法,算法,c++,开发语言,动态规划
吃豆游戏

注:从⭐️开始。

    显然,选豆多的就错了! 

        2.揭秘 dp  

    dp 需要递推或递归(时间复杂度高,可用递推代替,不推荐)来实现,即若要算出算出 i 的最优解,就要算出 i-1 的最优解,若要算出i-1的最优解,就要算出 i-2 的 最优解······,最后需要一个边界值,即 0、1 或 2 的最优解,要不然递推就回输出 0,递归就回死循环。而从 i-1 到 i 的过程就是动态转移方程。

二、应用

    刚才的吃豆游戏,搜索就可以得到 O(n) 的时间复杂度。但如果改变一下地图,有多条路段可以到达一条路,搜索的时间就明显不够了,我们可以尝试 dp:

        1.定义

        表示走过路段 i 的最大值。

        2.边界值

          即第一条路别无选择,只有一条路。

        3.动态转移方程

        c++ 算法之动态规划—— dp 详解,c++ 算法,算法,c++,开发语言,动态规划,其中 j,j+1,j+2······ 表示所有可以到达它的路口的编号。

        4.结果

        c++ 算法之动态规划—— dp 详解,c++ 算法,算法,c++,开发语言,动态规划 即所有路段的最大值的最大值。

        5.代码

int f[1005] = {0};
for(int i = 0;i < n;i ++)
{
    for(int j = 0;j < mp[i].size();j ++){
        f[i] = max(f[i],f[mp[i][j]] + v[i]);
    }
}

        这里 mp 是存放地图的 vector ,mp[i][j] 表示与第 i 条路段相连的第 j 条路段。 文章来源地址https://www.toymoban.com/news/detail-845588.html

到了这里,关于c++ 算法之动态规划—— dp 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【数位dp】【动态规划】C++算法:233.数字 1 的个数

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

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

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

    2024年02月05日
    浏览(54)
  • DP算法:动态规划算法

    (1)确定初始状态 (2)确定转移矩阵,得到每个阶段的状态,由上一阶段推到出来 (3)确定边界条件。 蓝桥杯——印章(python实现) 使用dp记录状态,dp[i][j]表示买i张印章,凑齐j种印章的概率 i表示买的印章数,j表示凑齐的印章种数 情况一:如果ij,不可能凑齐印章,概

    2024年02月07日
    浏览(51)
  • 【c++】动态规划(dp)框架

    动态规划(Dynamic Programming)是解决计算问题的一种方法,通常用于解决优化问题和涉及重叠子问题的计算问题。它的核心思想是通过将问题分解为更小的子问题来求解,并且记忆化子问题的解,避免重复计算,从而提高效率。下面详细解释动态规划以及优化方法,并提供一个

    2024年02月03日
    浏览(44)
  • 算法——动态规划(DP)——递推

    动态规划常用于解决优化问题。 动态规划通常以自底向上或自顶向下的方式进行求解。 自底向上的动态规划从最简单的子问题开始,逐步解决更复杂的问题,直到达到原始问题。 自顶向下的动态规划则从原始问题出发,分解成子问题,并逐步求解这些子问题。 动态规划算法

    2024年01月20日
    浏览(57)
  • 动态规划(DP)(算法笔记)

    本文内容基于《算法笔记》和官方配套练题网站“晴问算法”,是我作为小白的学习记录,如有错误还请体谅,可以留下您的宝贵意见,不胜感激。 动态规划(Dynamic Programming,DP)是一种用来解决一类最优化问题的算法思想。简单来说,动态规划将一个复杂的问题分解成若干个子

    2024年02月05日
    浏览(47)
  • 【算法】动态规划(dp问题),持续更新

    介绍本篇之前,我想先用人话叙述一般解决动态规划问题的思路: 动态规划的问题,本身有许多产生结果的可能,需要在具体题目下得到满足某个条件的解。 如何得到呢? 我们就需要根据这个具体问题,建立一个状态表( dp 表 ),在这张 dp 表中的每一个位置的数据都有明

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

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

    2024年02月08日
    浏览(50)
  • 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日
    浏览(42)
  • 算法套路十三——动态规划DP入门

    动态规划和递归都是通过将大问题分解为较小的子问题来解决问题。它们都可以用来解决具有重叠子问题和最优子结构特性的问题。 递归是一种自顶向下的方法, 它从原始问题开始 ,递归地将问题分解为较小的子问题dfs(i)—— dfs(i)代表的是从第i个状态开始进行递归求解能

    2024年02月15日
    浏览(60)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包