DP刷题总结-2

同步于Luogu blog

T1 AT_joisc2007_buildi ビルの飾り付け (Building)

简化题意

最长上升子序列模板

分析

O(n2)做法

考虑DP

  1. 定义状态:dpi表示以i结尾的最长上升子序列长度
  2. 确定答案:maxdpi
  3. 状态转移:对于每个ai
    (1)当ai>aj(j<i)从以第j个数结尾的地方再接一个数,即dpj+1
    (2)自己单独成一个子序列
  4. 边界条件:dpi=1(每个数都能单独成一个子序列)

O(nlogn)做法

考虑贪心(往死里贪)
所以对于最大上升子序列,结尾元素越小,越有利于后面接上其他的数,也就可能变得更长
所以创建一个数组c,用来存贮现在的最长上升子序列中的元素
对于每个ai,可以在c数组中找到一个第一个比他大的数,那么这个数就能替换掉c数组中的那个数,而dpi的答案就是找到的数的下标,因为前面都是比他小的数,自然的,他也可以接在这些数后面
但是这样可能还是要扫一遍c数组,但我们能发现,c数组永远是单调递增的!所以使用二分大法,时间复杂度O(nlogn)
P.S.:c一定要初始化为无穷大,因为数要越小越好

Code

link1
link2

T2 AT_abc281_d [ABC281D] Max Multiple

分析

  1. 定义状态:dpi,j,p表示前i个数,选了j个,余数为p时的最大和
  2. 答案:dpn,k,0(dpn,k,00),否则为1
  3. 方程:
    (1)不选这个数:dpi1,j,p
    (2)选这个数:dpi1,j1,(pai)modd+ai
  4. 边界:dpi=infdp0,0,0=0

Code

link

T3 AT_abc369_d [ABC369D] Bonus EXP

题意简化

n只怪物,每只怪物有一个数值ai,对于每只怪物,你有两种选择:

  1. 放走他,获得0经验
  2. 击败他,获得ai经验,特别的,如果这只怪兽是你击败的偶数只怪物,你还可以额外获得ai经验
    求最后你能获得多少经验

分析

  1. 定义状态:dpi,0/1表示前i个怪物,选了奇数/偶数个怪物的最大经验
  2. 答案max(dpn,0,dpn,1)
  3. 状态转移方程:
    (1)选第i个怪物,且为奇数个:max(dpi1,0,dpi1,1+ai)
    (2)选第i个怪物:max(dpi1,1,dpi1,0+2×ai)
  4. 边界:由于a可能有负数,所以dp设为负无穷

Code

link

还有两题有时间补上

posted @   KK_SpongeBob  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体
点击右上角即可分享
微信分享提示