首页 > 其他分享 >动态规划--一维dp和二维dp

动态规划--一维dp和二维dp

时间:2024-02-17 17:13:25浏览次数:19  
标签:状态 一维 -- 二维 dp 数组 当前 DP

在解决背包问题时,使用一维动态规划数组和二维动态规划数组都是常见的方法,选择哪种方式取决于问题的特点和解法的需要。

使用一维DP数组的情况:

  1. 状态转移方程只涉及到上一行的元素:

    • 当状态转移方程只涉及到上一行的元素时,可以使用一维DP数组。这样能够降低空间复杂度,使算法更为简洁。
  2. 问题中只需要考虑当前状态的前一个状态:

    • 如果问题中只需要考虑当前状态和前一个状态之间的关系,而不需要考虑更远的状态,可以选择使用一维DP数组。

使用二维DP数组的情况:

  1. 状态转移方程涉及到上一行和当前行的元素:

    • 当状态转移方程涉及到上一行和当前行的元素时,通常需要使用二维DP数组。例如,背包问题中的状态转移方程常常涉及到两个维度,一个表示物品,一个表示背包容量。
  2. 问题需要保留更多的信息:

    • 如果问题需要保留更多的信息,可能需要使用二维DP数组来存储这些额外的信息,以便后续计算。例如,记录达到当前状态的路径、组合方式等。
  3. 更直观的表示状态:

    • 对于一些复杂的问题,使用二维DP数组可以更直观地表示问题的状态和状态之间的关系,提高代码的可读性。

示例:

一维DP数组示例:

dp = [0] * (target+1)
for num in nums:
    for i in range(target, num-1, -1):
        dp[i] += dp[i-num]

二维DP数组示例:

dp = [[0] * (target+1) for _ in range(len(nums)+1)]
for i in range(1, len(nums)+1):
    for j in range(target+1):
        dp[i][j] = dp[i-1][j]
        if j >= nums[i-1]:
            dp[i][j] += dp[i-1][j-nums[i-1]]

总的来说,选择使用一维DP数组还是二维DP数组,取决于问题的特点和解法的需要。在一些情况下,通过巧妙的设计,可以将二维DP数组优化成一维DP数组。

上一行和当前行的含义
在动态规划中,经常会用到“上一行”和“当前行”这两个概念,尤其是在使用二维动态规划数组时。这两者的区别在于它们对应于不同的状态或阶段。

  1. 上一行(Previous Row):

    • 指的是当前阶段之前的一个阶段,也就是在DP数组中的上一行。
    • 在二维DP数组中,通常表示为dp[i-1][...],其中i是当前行的索引。
    • 上一行对应于之前的状态,用来计算当前行的状态。
  2. 当前行(Current Row):

    • 指的是当前阶段,也就是在DP数组中的当前行。
    • 在二维DP数组中,通常表示为dp[i][...],其中i是当前行的索引。
    • 当前行对应于当前状态,是根据上一行的状态计算得到的。

在讨论背包问题时,这两者的具体含义可以理解为:

  • 上一行: 表示考虑到当前物品之前的状态,即在选择当前物品之前的状态。
  • 当前行: 表示在考虑当前物品时的状态,即在选择当前物品后的状态。

具体到代码中,通过这两者的概念,我们可以方便地设计状态转移方程,使用前一行的信息来更新当前行的信息,从而实现动态规划的递推过程。

标签:状态,一维,--,二维,dp,数组,当前,DP
From: https://www.cnblogs.com/taixian/p/18018134

相关文章

  • Minimize OR of Remaining Elements Using Operations
    MinimizeORofRemainingElementsUsingOperationsYouaregivena 0-indexed integerarray nums andaninteger k.Inoneoperation,youcanpickanyindex i of nums suchthat 0<=i<nums.length-1 andreplace nums[i] and nums[i+1] withas......
  • 集合
    Collection集合特点**1、List系列集合:添加的元素是有序、可重复、有索引。**子类常用到ArrayList、LinkedList:有序、可重复、有索引。arrlist底层原理,默认创建一个长度为10的数组,存满时会创建到1.5倍,再满就按照实际长度二者的区别是数据结构不同linkedlist底层原理基......
  • 第四、五章——内存和磁盘
    计算机的处理对象数据是储存在内存和磁盘上的。内存————内存的物理机制—内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚,通过为其指定地址,完成数据的读写。内存的逻辑模型是楼房,一层可以存储一个字节的数据,楼层就是地址。变量的数据类型不同,所占用的......
  • 华硕推出首款ROG NUC迷你主机:酷睿Ultra+RTX 4070
    华硕今日推出了首款ROGNUC迷你主机,设计十分小巧,并且配有标志性的ROGRGB徽标。据了解,新款迷你主机最高可选英特尔酷睿Ultra9185H处理器和英伟达RTX4060/4070显卡。同时支持双通道DDR5内存,速度达5600MT/s,最大容量128GB。这款主机附带一个支架,可以水平或垂直放置,采用高性能......
  • DP总结
    DP(动态规划)简介动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。由于动态规划并不是某种具体的算法,而是一种解决特定问题的方法,因此它会出现在各式各样的数据结构中,与之相关的题目种类也更为繁杂。DP基础1.必要前提需要满足三个条件:最优子......
  • AI抠图神器RMBG下载介绍
    RMBG是一款先进的AI抠图工具,和其它同类型软件不同的是,RMBG不需要人工勾勒图形轮廓,可以自动识别图像的前景并去除背景,节省大量时间,效果非常惊艳 最新中文版下载:百度网盘:https://pan.baidu.com/s/18BK6LTZ1V6xoGgyFmhdTfQ?pwd=void RMBG的模型是在精心选择的数据集上训练的,......
  • 树形dp
    树形dp模型:给定一颗有n个节点的树,任选一个节点为根节点,从而定义出每个节点的深度和每棵子树的根。基本思路:1.建树2.列出动态转移方程典型例题:没有上司的舞会#include<bits/stdc++.h>usingnamespacestd;intn,l,k,ans;vector<int>son[6600];intf[6600][2],v[6600],r......
  • 快读快写模板
    快读函数点击查看代码intread(){intsign=1,re_in=0;charc=getchar();while(c<'0'||c>'9'){if(c=='-')sign=-1;c=getchar();}while(c>='0'&&c<='9'){......
  • 三维偏序 cdq
    Describe:有\(n\)个元素,第\(i\)个元素有\(a_i、b_i、c_i\)三个属性,设\(f(i)\)表示满足\(a_j\leqa_i\)且\(b_j\leqb_i\)且\(c_j\leqc_i\)的\(j\)的数量。对于\(d\in\left[0,n\right)\),求\(f(i)=d\)的\(i\)的数量。Solution:终于理解CDQ。首先......
  • 【网课下载教程】网课视频下载攻略:让学习更高效
    在当今互联网时代,在线学习已成为越来越多人的选择。有时,我们希望离线观看网课视频,以避免网络不稳定等问题。本文将为您提供一篇详细的网课视频下载教程,助您更高效地学习。一、为什么下载网课视频?无需依赖网络:下载后的视频可以在没有网络的情况下观看,便于在交通工具、户外等环境......