首页 > 其他分享 >DP学习笔记

DP学习笔记

时间:2024-03-09 16:55:37浏览次数:25  
标签:方程 填表 笔记 学习 leq Part 我们 DP

Part 1:DP 的本质

相信每个同学,都曾经有过被 DP 虐的经历。大部分同学在初学 DP 的时候,总是见一道题背过一道题,最后基本上是学会所有常见的套路,然后开始套模板。

然而,随着层次的提升,这种文科生的思维就不够用了——毕竟谁会在 IOI 上傻乎乎地出个石子合并或者是多重背包呢?

这样,我们就需要贴近 DP 的本质。

简单来说,DP 是一个填表的过程。通常情况下,DP 的转移方程总是会涉及到一个数组,比如说这个:

\[f_{i,j}=max\{f_{i-1,j},f_{i-1,j-w_i}+c_i\} \]

是 01 背包的转移方程。实际上他就相当于是在填写一个表格,第 \(i\) 行 \(j\) 列的内容就是前 \(i\) 个物品不超过 \(j\) 的最大价值。这里是一个递推关系,也就是说我们需要通过之前的内容推导出来现在的内容。

Part 2:DP 的技巧

1.状态不够

比如说Vacation 。如果仅仅是最大值,那么我们也就无需搬出 DP 了。然而我们的题目给我们规定了一个非常可·爱的条件:

但他不能连续两天进行同一种活动

那么我们就需要加上一维“今天做的事情”。

2.状态过大

比如说Knapsack 2。这个题猛一看好像很简单,但是再一看呢?

  • $ 1\ \leq\ N\ \leq\ 100 $

  • $ \color{red}1\ \leq\ W\ \leq\ 10^9 $

  • $ 1\ \leq\ w_i\ \leq\ W $

  • $ 1\ \leq\ v_i\ \leq\ 10^3 $

然后呢?我们发现按照我们最开始的方法是无法通过这个题目的。因为这个特殊的数据范围,我们需要进行调换。

Part 3:刷表与填表

刷表法和填表法是两种各有优劣的方法。举个例子,斐波那契数列也可以算作是一个简单的 DP,那么我们就可以列出方程:

\[f_i=f_{i-1}+f_{i-2} \]

那么这其实就是填表法,也就是说,枚举的是结果,也就是 \(f_i\)。简单而又明了,是不是每个人都是这么想的?

有同学可能就会问了:难道还有别的做法吗?这个不就很简单了吗?

然而你再看这个转移方程:

\[f_{i+1}=f_i+f_{i+1},f_{i+2}=f_i \]

似乎也是正确的。这里我们其实是枚举每一个已知量,然后检查所有有关的量。对于这道题来说,填表法就足够的好用。然而对于一些你并不知道它的确切的“\(f_i\) 究竟是从哪里来的”的题目而言,这种做法就显得十分有价值。另外,填表法在有些地方会产生巨大的时间复杂度,这个时候刷表法的价值就体现出来了。

标签:方程,填表,笔记,学习,leq,Part,我们,DP
From: https://www.cnblogs.com/liyuanzhuo6811/p/18062964

相关文章

  • CF1635F 笔记
    好题啊。题意给定\(n\)个二元组\((x_i,w_i)\),保证\(x\)升序。有\(m\)个询问\([l,r]\),对于每个询问求出:\[\min\limits_{l\lei<j\ler}(x_j-x_i)\cdot(w_i+w_j)\]题解一个精妙的结论:设\(L_i\)表示\(i\)左边第一个满足\(w_j\lew_i\)的\(j\),\(R_......
  • MYSQL学习笔记22: 多表查询
    多表查询单表查询查询emp表select*fromemp;查询dept表select*fromdept;笛卡尔积(全组合)#emp表有4条记录,dept表有6条记录#笛卡尔积有4*6=24条记录select*fromemp,dept;消除无效的笛卡尔积(emp和dept通过dept_id连接)select*fromemp,deptw......
  • 神州笔记本 win11 节能模式 供电不足 自动关机
    刚刚买了一个神州笔记本没几天,用着用着就出现问题了。本人使用电脑有个极为不好的习惯,那就是会一次性打开特别多的应用,然后不关,一直留着,这个习惯虽然不好但也是一直没有啥问题的,不过最近换了个新的笔记本就出现了问题。神州笔记本开启省电模式:之所以开这个模式其实并不是为......
  • P5416 笔记
    前置知识:线段树分治。题意给定\(n\)个节点的树,每个节点有一个二元组集合\(S_i\)。这个集合有一个限制:\(S_i\)一定是\(S_{fa_i}\)中删除一个二元组或者加一个二元组,并且加进来的二元组互不相同。现在有\(m\)个询问,每个询问给出\(k,h\)表示查询\(\min\limits_{(x,c......
  • 腾讯视频号直播卖货学习第五课-直播爆品三大特征
    腾讯视频号直播卖货学习第五课-直播爆品三大特征1满足泛用户需求1)视频号04+女性较多,转化以女性为主80%,一二三线占比60%+2)熟龄姐姐的需求保养,健康,家庭生活,教育,休闲娱乐,心里安慰,性价比等。3)城市中年大叔的需求:健康送礼收藏新奇特社交谈资休闲娱乐 2有认知也有教育空......
  • 无模型的强化学习方法
    无模型的强化学习算法学习「强化学习」(基于这本教材,强烈推荐)时的一些总结,在此记录一下。动态规划算法需要马尔可夫决策过程是已知的(状态转移函数、奖励函数已知),智能体不用真正地与环境互动也能在「理性」世界里求得最优策略。现实通常并非如此,环境已知恰恰是很少见的。所以这里......
  • OpenMP-threadprivate
    threadprivate是OpenMP中的一个指令,用于在多线程环境中为每个线程创建私有变量。通常情况下,OpenMP中的变量默认是共享的,也就是说所有线程都可以访问同一个变量的同一份副本。然而,在某些情况下,需要为每个线程创建独立的变量副本,以避免并发访问问题。threadprivate指令允许程序员将......
  • Java学习笔记——第十天
    面向对象高级(一)staticstatic是一个关键字,义为静态,可以修饰成员变量和成员方法。static修饰成员变量成员变量的分类类变量(静态成员变量):有static修饰的成员变量,它们属于类,在计算机里只有一份,会被类的全部对象共享。实例变量(对象成员变量):无static修饰的成员变量,属于每个对象,每......
  • Living-Dream 系列笔记 第2期
    本期主要讲解vector、map两个STL容器。知识点:首先,引入两种数组的区别:静态数组,指提前声明需要多少内存的数组,是连续的;而动态数组则是在插入元素时临时指定存储空间,不要求连续。STLvector是一个动态数组,下标默认从\(0\)开始。它支持的操作如下:定义:一维vector......
  • Living-Dream 系列笔记 第3期
    本期主要讲解二分查找。知识点二分查找:思想:分治。使用场景:在一个有序序列中,反复查找不同目标。时间复杂度:\(O(n\logn)\)。实现:对数列排序;确定二分边界(通常为L=最小下标-1,R=最大下标+1);伪代码:intL=左边界-1,R=右边界+1;while(L+1<R){intmid=(L+R)......