CF505C Mr. Kitayuta, the Treasure Hunter
题目
见链接。
题解
知识点:线性dp。
常规的状态 表示为到第 个岛上一步走了 能得到宝藏的最大值,会炸空间。注意到步数是就算从 开始走到结束,最多不会超过初始步数 的 。因此,改变状态为到第 个岛上一步的关于 的偏移量为 (负数不能表示,所以整体加 )。
遍历 时要注意边界条件,如步数 ,上一次的岛屿编号 。
初始位置的宝藏要初始化进去,其他应该是负无穷。
答案不一定在最后一个岛上,因为可能跳不到,所以考虑在过程中取最大值即可。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; int dp[30007][607]; int p[30007]; int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n, d; cin >> n >> d; for (int i = 1, tmp;i <= n;i++) cin >> tmp, p[tmp]++; memset(dp, -0x3f, sizeof(dp)); dp[d][300] = p[d]; int ans = p[d]; for (int i = d + 1;i <= 30000;i++) { for (int j = 10;j <= 590;j++) {///偏移量不超过±250 if (1 <= d + j - 300 && i - (d + j - 300) >= 1) {///步数不小于1,岛屿不小于1 dp[i][j] = max({ dp[i - (d + j - 300)][j - 1], dp[i - (d + j - 300)][j], dp[i - (d + j - 300)][j + 1] }) + p[i]; } ans = max(dp[i][j], ans);///有可能跳不到30000而直接超过30000,但一定能经过最大值路径上的岛屿,每次保存最大值即可 ///因为终点未知,也可以考虑逆推,因为起点固定 } } cout << ans << '\n'; return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16581643.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具