扩大
缩小

【CSP-J2020 T4】方格取数

考虑对每一列进行 DP。

f(i,j) 代表从 (1,1) 走到第 i 列第 j 行的最大值,sum(i,j,k) 代表在第 i 列中第 j 行到第 k 行的数字之和。

那么很明显地,当 i>1f(i,j) 一定收到 f(i1,k) 中的其中一个 k 推导出。

而从 f(i1,k) 走到 f(i,j),就需要这样走:(i1,k)(i,k)(i,j)

如果不这么走,变为 (i1,k)(i1,j)(i,j) 路径的话,那你也没必要从 (i1,k) 出发求得答案,直接往右移动一格即可。

所以,转移方程为:

f(i,j)=max{f(i1,k)+sum(i,min(j,k),max(j,k))}+ai,j

处理一下各列前缀和,时间复杂度 O(n2m),可以拿到 70 分。

现在考虑如何优化:

可以观察到,(i1,k)(i,k) 后,想到达任意一个 (i,j) 只能往上或往下走。

这说明一些 f(i,j) 可能与 f(i,j1)f(i,j+1) 的答案路径有重合部分,即 f(i,j1)f(i,j+1) 可能推出 f(i,j)

但 DP 不能有后效性,不能在同一列又上又下,所以我们开两个数组 g,h,并设计策略:

g(i,j)=max(f(i1,j),g(i,j1))+ai,j

h(i,j)=max(f(i1,j),h(i,j+1))+ai,j

f(i,j)=max(g(i,j),h(i,j))

特殊地,对于 i>1g(i,1)=f(i1,1)+ai,1h(i,n)=f(i1,n)+ai,n

正确性显然,对于任意 (i,j)gh 至少包含一条答案最大路径。

时间复杂度 O(nm)g,h 数组可以降至一维重复使用。

注意开 long long。

posted @   HoshizoraZ  阅读(1162)  评论(1编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示