AT_DP

攻略

  1. 先设计一个一定保证正确性的状态,可以完全朴素甚至可以n维

  2. 考虑保证正确性的情况下:合并同类状态,消除无用状态,消除无用转移。

  3. 对递推式进行分类,只与当前点有关的直接处理,只与以前相关的点预处理,既与当前有关又与现在有关考虑斜率优化(有单调性用单调队列,否则二分或李超)

A

显然

B

显然

C

显然

D

01背包模板
dp[i][j] 表示考虑了 i 个物品,背包容量为 j 的最大价值

  • 选第 i 件物品,那么背包容量剩余 jwii1 个物品,价值为 dp[i1][jwi]+vi
  • 不选第 i 件物品,那么背包容量仍然不变为 j ,这时价值为 dp[i1][j]

所以可以得到 dp 的转移方程:

dp[i][j]=max(dp[i1][jwi]+vi,dp[i1][j])

滚动数组状态变为 dp[j] ,倒序枚举

则原方程变为:

dp[j]=max(dp[jwi]+vi,dp[j])

E

dp[i][j] 表示考虑 i 个物品,总价值是 j 所需的最小容量

  • 拿第 i 件物品,那么别的物品的总价值需要凑出 jvi 考虑 i1 件物品的最优选取方式,即最终重量为 dp[i1][jvi]+wi

  • 不拿第 i 件物品,那么别的物品需要凑出 j 的价值。考虑前 i1 件物品的最优选取方式,即最小重量为 dp[i1][j]

所以可以得到 dp 的转移方程:

dp[i][j]=min(dp[i1][jvi]+wi,dp[i1][j])

滚动数组

则原方程变为:

dp[j]=min(dp[jvi]+wi,dp[j])

F

设状态 dp[i][j]s 的前 i 项与 t 的前 j 项的 LCS

  • 如果 s[i]=t[j] ,则 dp[i][j]=dp[i1][j1]+1

  • 否则, dp[i][j]=max(dp[i1][j],dp[i][j1])

同时记录路径,最后从 (n,m) 向前回溯得到字符串

G

由于该题为有向无环图,因此我们可以按序去搜索遍历每一个点。若该点未被访问过,则对其进行搜索;否则,就可以直接对该点保存的答案进行求最大。

H

显然

I

dp[i][j] 表示前 i 个元素有 j 个向上的概率。只需要枚举当前硬币是向上还是向下即可,与背包类似。

转移方程为:

f[i][j]=f[i1][j1]×pi+f[i1][j]×(1pi)

计算完毕后,统计一半硬币向上的答案。

J

考虑最暴力的做法,用 dp[a1][a2]...[an] 表示第 i 盘还剩 ai个寿司的期望次数。那么枚举随机到的数 i 就可以得到方程:

dp[a1][a2][an]=1+i=1n1ndp[a1][a2]...[max(ai1,0)]...[an]

注意到第几盘寿司没有区别,因此可以合并状态,只记录剩余寿司的盘数
因为 ai3 所以至多有四种不同数值: 0,1,2,3 。我们重新定义状态 dp[a][b][c][d] 表示当前还剩下 a/b/c/d 盘有 0/1/2/3 个寿司。
枚举当前随机到的盘子里还剩几只寿司得到如下方程:

dp[a][b][c][d]=1+andp[a][b][c][d]+bndp[a+1][b1][c][d]+cndp[a][b+1][c1][d]+dndp[a][b][c+1][d1]

移项整理得到转移方程:

dp[a][b][c][d]=b+c+dn+b+c+dbdp[a+1][b1][c][d]+b+c+dcdp[a][b+1][c1][d]+b+c+dddp[a][b][c+1][d1]

注意到 a+b+c+d=n
因此任意三个数可以确定另一个数,所以可以合并状态,又因为 a 在方程中参与度不高,所以把 a 这一维压掉。
得到

dp[b][c][d]=b+c+dn+b+c+dbdp[b1][c][d]+b+c+dcdp[b+1][c1][d]+b+c+dddp[b][c+1][d1]

K

设状态很重要,如果设某一个人的胜负,每一步状态都需要考虑两个决策,过于困难。

若设状态为当前操作者的胜负,则只需要考虑一个人的决策(其实是因为题面中两人没有本质上的的区别)

dp[i] 表示在剩余 i 块石头时,当前操作者的胜负。

显然,状态 dp[i] 可以转移到 $dpi+a_j $ 。

有一个显然的结论:在剩余 0 块石头时,当前操作者必败。

那么,如果一个状态能转移到一个必败状态,那么当前操作者一定必胜。

当前操作者只需要选择转移到那个使对手必败的状态,就可以让自己必胜(这也是博弈论的重要结论)。

所以我们可以从 dp[1] 开始递推求解,最终答案为 dp[k]

L

显然游戏过程中剩下的数必然是连续的一段。设 dp[i][j] 表示剩下下标为 [i,j] 的数时,先手(并非当前的先手而是开始时的先手,下同)能取得的最大分数差。

分两种情况讨论:

  • 已经取走的数为偶数个,此时先手取, dp[i][j]=max(dp[i+1][j]+ai,dp[i][j1]+aj)

  • 已经取走的数为奇数个,此时后手取, dp[i][j]=min(dp[i+1][j]ai,dp[i][j1]aj)

还有一种神奇的解法:

考虑数列中存在 3 个连续的数 ai,ai+1,ai+2 满足 aiai+1 并且 ai+1ai+2 ,此时一方任取两边的数,则另一方取中间的数最优,所以,这 3 个数可以等效合并为 1 个大小为 ai+ai+2ai+1 的数。

将数列中满足条件的数等效合并完后,数列一定满足先递减后递增,此时从两端贪心即可。

重点在于发现这种合并对全局生效

M

dp[i][j] 表示考虑到第 i 个小朋友,当前已经用掉 j 个糖的方案数。

转移方程:

dp[i][j]=k=max(0,jai1)jdp[i1][k]

发现公式里每个 dp 值都由上一行中一段连续的 dp 值之和转移而来,可以前缀和优化转移。

N

dp[i][j]ij 的答案,
则枚举其中间点 k 取最小值:

合并的代价的最小值。

于是就可以推出转移方程:

dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+p=ijap)

前缀和优化

posted @   WJChp  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示