【题解】P1437 [HNOI2004] 敲砖块

题意

P1437 [HNOI2004] 敲砖块

给定一个凹槽 a,第 i 行(列)有 ni+1 个值,第 i 行第 j 列的值为 ai,j。限制取 ai,j 前必须取 ai1,jai1,j+1。在至多取 m 个值的情况下,求取出的值的和的最大值。

1n50,1mn(n+1)2

思路

“二维xjbDP”(或 bdfs,即 Baidu-First Search)

贪心一类的乱搞显然难过,一眼 dp。

容易想到以行划分状态,但是第 i 行是否能取与第 i1 行的状态有关,即状态有后效性,所以是错的。

我们发现后效性与列有关,所以考虑以列划分状态。即令产生后效性的状态被预先确定好,使其不能影响当前状态。容易看到对于第 j 列,如果要取到第 i 行,则必须要取前 i1 行,并且第 j+1 列至少要取到第 i1 行。

基于这种思路,令 dp[i][j][k] 表示取到第 i 列第 j 行,一共取 k 个值时的答案。根据上文,此时能转移过来的状态是 [ dp[i+1][j1][kj],dp[i+1][n(i+1)+1][kj] ]。所以得到状态转移方程:

dp[i][j][k]=maxl=j1n(i+1)+1(dp[i+1][l][kj])+k=1jak,i

朴素 dp 时间复杂度太高,考虑优化。

k=1jak,i 可以前缀和预处理。maxl=j1n(i+1)+1(dp[i+1][l][kj]) 也可以后缀最大值预处理,所以时间复杂度优化成 O(n2m)。容易发现第 i 行状态的转移只与第 i+1 行的状态有关,因此可以滚动数组。

时间复杂度 O(n2m),空间复杂度 O(nm)

代码

posted @   kymru  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
主题色彩