DP小结

本文是对动态规划(DP)的总结,包括刷表法、填表法、分解步骤、单独计算枚举上限等方法,并结合具体题目如BZOJ4033树上染色进行解析,阐述树形DP的状态设计和合并子问题策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DP小结

DP本质就是状态压缩——只记录和答案有关的值。

所以DP的解法大概就是:

①不断探索问题性质(数位DP体现得比较明显,如BZOJ1026 windy数,还有一道缺了题号的题

②减少那些和答案有关的值的个数(比如要从题目中筛选信息来定出状态,列出方程)。

——scαpe

只是说说而已,DP并没有什么定式。

一些方法

这些方法说不定可以提供一些思路[滑稽]。

以下内容完全按照意识流顺序出现。

刷表法与填表法

举个例子来说,就是:

刷表法(也经常在状态压缩里面遇见,也许可以避免初始化):当简单的状态不方便表示的时候,可以考虑刷表法,比如 f[i+k]+=f[i] f [ i + k ] + = f [ i ] 之类的。如 f[i][j]=(@!./)f[i1][j1] f [ i ] [ j ] = ( @ ! ∗ ‘ . / ) ∗ f [ i − 1 ] [ j − 1 ] 之类的神仙转移就可以用刷表法。比如一道缺了题号的题

填表法: f[i]=f[i1]... f [ i ] = f [ i − 1 ] . . . 之类。

分解步骤

把一个大的东西分成很多个小块讨论。比如计算一堆链的权值和,一条链由很多线段构成,可以把每条线段对答案的贡献单独提出来算(BZOJ4033 树上染色);比如求一堆数字的二进制位的 xor,or,and... x o r , o r , a n d . . . 值,可以按位运算,即把这一堆数的某一位提出来单独运算,最后把答案合起来……

单独计算枚举上限

防止时间复杂度退化。具体看题目咯,比如BZOJ4033 树上染色

树形DP常用状态

状态中有一维表示以 i i 为根的子树。比如BZOJ4033 树上染色中的状态f[i][j]表示 i i 为根的子树中有j个黑点。

两两合并子问题(树形DP)

一棵树可以有很多儿子,这些儿子又有很多新儿子……(无限递归调用)设 i i 为树的根,它的n个儿子分别为 s1,s2,s3,...,sn s 1 , s 2 , s 3 , . . . , s n 。那么按顺序以如下方式计算:

s1+s2;s1,s2+s3;s1,s2,s3+s4;...;s1,s2,s3...sn1+sn s 1 + s 2 ; s 1 , s 2 + s 3 ; s 1 , s 2 , s 3 + s 4 ; . . . ; s 1 , s 2 , s 3 . . . s n − 1 + s n

+号左边的部分看做一个整体,右边看做另一个整体,依次合并。最后一次合并之后就得到了以 i i 为根的树的相关值。比如BZOJ4033 树上染色

前缀思想(数位DP)

[a,b]中满足某一特征的数,可看为 [1,b][1,a1] [ 1 , b ] − [ 1 , a − 1 ] ​ 两步。

例如:BZOJ1026 windy数 BZOJ1799 self 同类分布

嵌套DP

一些DP题,一次DP不够,还要在第一次DP的基础上再来一波DP。

比如BZOJ2287 消失之物退背包问题

一篇树形DP的总结
……

暂时就这些了吧?竟然哔哔了这么多,汗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值