首页 > 其他分享 >动态规划-基础

动态规划-基础

时间:2024-05-05 17:33:40浏览次数:19  
标签:遍历 int 递推 基础 确定 数组 动态 规划 dp

某一问题有很多重叠子问题,使用动态规划是最有效的。动态规划中每一个状态是从上一个状态推导出来的。与贪心不同,贪心没有状态推导,从局部中直接选取最优解。

动态规划五部曲:

  1. 确定dp数组以及下标的含义
  2. 确定递推公式
  3. dp数组的初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

example:

leetcode 509

计算斐波那契数列f(n),我们按照上述五部曲的顺序来确定

  1. 确定dp数组以及下标的含义:dp[i]定义为第i个数的斐波那契数值是dp[i]
  2. 确定递推公式:递推公式已经由斐波那契数列的性质给出:dp[i]=dp[i-1]+dp[i-2]
  3. dp数组的初始化:题目中已告知,dp[0]=0,dp[1]=1
  4. 确定遍历顺序:由于第i个数值依赖于第i-1和第i-2个数值,因此遍历顺序是从前到后遍历
  5. 举例推导dp数组: 0 1 1 2 3 5 8 13......
class Solution{
public:
    int fib(int N){
        if(N <= 1){
            return N;
        }
        vector<int> dp(N+1);//确定dp数组
        dp[0]=0;
        dp[1]=1;//初始化递推数组
        for(int i=2;i<=N;i++){
            dp[i]=dp[i-1]+dp[i-2];
        }//遍历顺序
        return dp[N];
    }
};

整数拆分:

leetcode 343

这个题目的难处在于递推公式的确定,我们仍然按照dp的五步方法去做:

  1. 确定dp数组,dp[i]表示对数字i的分拆,得到最大乘积dp[i]
  2. 确定递推公式,由于是将正整数拆分为至少两个整数相乘,考虑到动态规划本就是当前状态由之前的状态递推出,因此我们需要考虑将整数拆分为两个整数相乘或者两个以上的整数相乘,因此:j为从1遍历到i-1,dp[i]从j * (i-j)和 j *dp[i-j]中选择,对j的拆分在遍历过程就实现了。
  3. 初始化dp数组,dp[0]与dp[1]无意义,初始化dp[2]=1即可
  4. 遍历顺序从前到后

代码为

class Solution{
public:
    int integerBreak(int n){
        vector<int> dp(n+1,0);
        dp[2]=1;
        for(int i=3;i<=n;i++){
			for(int j=1;j < i-1;j++){
            //考虑到拆分一个数使其乘积最大,一定是拆分近似相同的子数,即至少拆分为两个近似相同的数字,故此处for可写为for(int j=1;j<=i/2;j++)
                dp[i]=max(dp[i],max(j*(i-j),j*dp[i-j]));
            }
        }
        return dp[n];
    }
};

不同的二叉搜索树

leetcode96

首先定义dp[i],dp[i]表示i个节点组成的搜索二叉树共有dp[i]种

直观来看,容易推导dp[1]=1,dp[2]=2,找到重叠子问题,dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量,故有

dp[3]=dp[2] dp[0]+dp[1] * dp[1]+dp[0]dp[2]

class Solution{
public:
    int numTrees(int n){
        vector<int> dp(n+1,0);
        dp[0]=1;
        for(int i = 1;i<=n;i++){
            for(int j=0;j<i;j++){
                dp[i] += dp[j]*dp[i-1-j]
            }
        }
        return dp[n];
    }
};

标签:遍历,int,递推,基础,确定,数组,动态,规划,dp
From: https://www.cnblogs.com/perngfey-note/p/18173668

相关文章

  • 【LeetCode 1235】规划兼职工作
    题目描述原题链接:LeetCode.1235规划兼职工作解题思路想到了按照结束时间排序后用动态规划来处理,但是又局限在了以结束时间为维度进行递推,又卡在了时间不连续无法高效计算到最晚结束时间范围内所有时间对应值这一问题上,看了题解才知道用排序后的兼职工作数量为维度去递推......
  • 关于diffusion model一些统计和数学的基础知识
    likelihood-basedmodels,通过(近似)最大似然直接学习分布的probabilitydensity(或mass)函数。典型的基于似然的模型包括自回归模型、归一化流模型、基于能量的模型(EBMs)和变分自编码器(VAEs)。概率质量函数(ProbabilityMassFunction,PMF):概率质量函数用于描述离散随机变量的概率......
  • 程序语言基础
    程序语言基础导航目录程序语言基础导航一、程序设计语言二、各种程序语言特点三、高级程序设计语言四、编译器的工作阶段五、程序语言的数据成分六、程序控制结构七、表达式的例题八、传值、传址一、程序设计语言程序设计语言高级语言低级语言机器语言汇编语言指令语......
  • 洛谷题单指南-动态规划2-P1435 [IOI2000] 回文字串
    原题链接:https://www.luogu.com.cn/problem/P1435解题思路:方法1:回文字串的特点是,正着读、反着读是一样的换一个思路,对于一个字符串s,正序、逆序公共的部分就是已经是回文的部分,剩余的部分就是要插入的字符所以,问题转换为,计算一个字符串正序、逆序的最长公共子串,然后剩下的长度......
  • 2. 基础配置
    1.配置文件格式1.1配置文件自动提示功能消失解决方案​​1.2SpringBoot配置文件加载顺序(了解)application.properties>application.yml>application.yaml1.3注意事项SpringBoot核心配置文件名为applicationSpringBoot内置属性过多,且所有属性集中在一起修改,在使......
  • Linux基础
    目录一、Linux系统介绍二、Linux文件系统介绍三、什么是路径1、绝对路径2、相对路径3、特殊路径四、终端的使用技巧五、Linux系统命令1、常用的命令2、文件相关的命令3、目录相关的命令4、网络相关的命令5、其它命令六、通配符、管道、重定向1、通配符*代表任意多个字符?代表一......
  • 机器人移动的规划和导航
    现在,假如有一个机器人,它已经存储好一个全局的地图(哪里可通行,哪里不可通行),并且知道自己在其中的位置。现在要从给定的起点走到终点,我们应该怎么做?有轨导航和无轨导航在某些应用场景中,例如工厂或仓库,环境相对固定且对路径的准确性要求较高。这种情况下,我们可以使用有轨导航系统,比......
  • NVIDIA的人形机器人的基础模型Project GR00T已在实体机器人上进行展示
    原文地址:https://blogs.nvidia.com/blog/isaac-generative-ai-manufacturing-logistics/项目GR00T为人型机器人开发谢幕在GTC上展示,由GR00T驱动的人型机器人可以接受多模态指令——文本、视频和演示——以及它们之前的交互,以产生机器人所需的动作。GR00T在来自不同公司的四个......
  • Vue2基础
    【一】初识Vue【1】什么是VueVue是一套用于构建用户界面的渐(逐渐)进(递进)式JavaScript框架Vue可以自底向上逐层应用,由国人尤雨溪开发采用组件化模式,提高代码的复用率、让代码更好维护声明式编码方式,让编码人员无需直接操作DOM,提高开发效率使用虚拟DOM+优秀的Diff......
  • 路径规划:层次化路径规划系统——hierarchical pathfinding system —— Hierarchical
    项目地址:https://www.gdcvault.com/play/1025151/Hierarchical-Dynamic-Pathfinding-for-LargePPT地址:https://ubm-twvideo01.s3.amazonaws.com/o1/vault/gdc2018/presentations/Alain_Benoit_HierarchicalDynamicPathfinding.pdf视频地址:https://www.youtube.com/watch?......