gyx 背包+区间 DP(基础)

Arpa's weak amphitheater and Mehrdad's valuable Hoses

并查集变成分组背包


软件安装

tarjan + 树上背包DP
注意没有依赖的包都依赖一个没有代价的包
dp[i][j]为以i号点为根的子树中用不超过j的空间的最大价值。

Monster Hunter

树形dp
f[i][j][0∼1]​ 是以 i 为子树时,一共使用 j 次咒语,该点有、没有使用过咒语时的最小开销。
{dp[x][i+j][0]=max(dp[x][i+j][0],dp[x][i][0]+max(dp[v][j][0],dp[v][j][1]))
dp[x][i+j][1]=max(dp[x][i+j][1],dp[x][i][1]+max(dp[v][j][0],dp[v][j][1]−hp[v]))​


消失之物

回退背包板子
需要额外枚举减去贡献。
由于转移时有:

for(int j=m;j>=v[i];--j)
f[j][0]+=f[j-v[i]][0];

所以需要回退:

if(j-v[i]>=0) f[j][1]=f[j][0]-f[j-v[i]][1];



区间dp部分

愤怒的小鸟

简单装压DP,但是需要预处理经过两个点的函数经过的所有点。

后面还有很多,但是同质化严重,就不写了。

Sue 的小球

普通区间dp,但是由于每时每刻都在往下落,所以每一步都需要把还没有接到的下落的代价加上,算是一个套路。


二叉查找树

主要是转移方程很难想
由于Treap的中序遍历肯定不便,所以基于中序遍历的dfs序来dp

f[i][j][k]表示将中序遍历中i..j这段节点形成一棵树,要求所有节点的权值≥k,这棵树的修改代价+访问代价最小是多少

f[i][j][k]=min(f[i][j][k],f[i][t−1][t的权值](左子树)+f[t+1][j][t的权值](右子树)+i..j所有节点的访问频度之和)

f[i][j][k]=min(f[i][j][k],f[i][t−1][k]+f[t+1][j][k]+K+i..j所有节点的访问频度之和)

本质上也是区间dp罢...
反正式子我是想不出来

显然答案就是1,n,1


Pre-Order

诈骗题
其实就是区间dp板子
因为你的dfs序不能直接枚举,会爆炸,指数级复杂度

但是你可以弄一个虚父亲,就很好做了。


posted @ 2025-05-26 20:12  Dreamers_Seve  阅读(13)  评论(0)    收藏  举报