水一水今天的博客吧
T1
切了算了最长上升子序列板板题
T2
树形 Dp 唉我还是太菜了,知道是树形 Dp D不来(滑稽)
首先看下题目,如果隔离 m 个点,那么相当于在树上选择 m 个点作背包,定义 Dp 方程:dp [ u ] [ j ] 表示 u 子树内选择 j 个节点隔离并且一定选择u,那么除了考虑 u 的所有儿子之外,还要加上 u 和 u 爸爸切断的代价 1,所以转移很显然了:t = std :: min ( t , dp [ u ] [ k ] + dp [ v ] [ j - k ] ),其中 t 初值为 dp [ u ] [ j ] + 1,然后背包就好了……
T3
状压水水题……
T4
这是一道背包题是人都看得出来,但是……但是这题有个限制!
那就是你既要选择出一个子集S,S满足硬币价值的总和是K,再选出S的一个子集,如果其能够凑出某一个数,那么则记录这个数,需要求出记录过的所有的数……
这是一道很好的 Dp,有一定的限制条件,看到 N<=500 马上反应是 N 的 3 次方的 Dp,但是写不来啊,只会处理恰好满足 K 的集合 S ,这个做个背包就好了,但是枚举子集的复杂度是 3 的次方级别,伤不起啊。
可以考虑加一维 Dp 状态,Dp [ S ] [ S2 ] 表示选了 S 之后能够凑出 S2 的话那么这个 Dp 值为 True ,那么转移的时候就容易啦,统计Dp [ K ] 第 2 维,只要是 True就输出……
初值 Dp [ 0 ] [ 0 ] = 1,意义是没有硬币时一定能凑出 0 元……
转移的时候只能由 Dp 值为 1 的状态转移,枚举 N 的 3 次方……