CF505C Mr. Kitayuta, the Treasure Hunter
题目
见链接。
题解
知识点:线性dp。
常规的状态 \(dp[i][j]\) 表示为到第 \(i\) 个岛上一步走了 \(j\) 能得到宝藏的最大值,会炸空间。注意到步数是就算从 \(1\) 开始走到结束,最多不会超过初始步数 \(d\) 的 \(\pm 250\) 。因此,改变状态为到第 \(i\) 个岛上一步的关于 \(d\) 的偏移量为 \(j+300\) (负数不能表示,所以整体加 \(300\))。
遍历 \(j\) 时要注意边界条件,如步数 \(d+j-300 \geq 1\) ,上一次的岛屿编号 \(i-(d+j-300) \geq 1\) 。
初始位置的宝藏要初始化进去,其他应该是负无穷。
答案不一定在最后一个岛上,因为可能跳不到,所以考虑在过程中取最大值即可。
时间复杂度 \(O(30000*600)\)
空间复杂度 \(O(30000*600)\)
代码
#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;
}
CF505C Mr. Kitayuta, the Treasure Hunter的更多相关文章
- codeforces 505C C. Mr. Kitayuta, the Treasure Hunter(dp)
题目链接: C. Mr. Kitayuta, the Treasure Hunter time limit per test 1 second memory limit per test 256 me ...
- Codefores 506A Mr. Kitayuta, the Treasure Hunter( DP && dfs )
A. Mr. Kitayuta, the Treasure Hunter time limit per test 1 second memory limit per test 256 megabyte ...
- [Codeforces 505C]Mr. Kitayuta, the Treasure Hunter
Description The Shuseki Islands are an archipelago of 30001 small islands in the Yutampo Sea. The is ...
- 【codeforces 505C】Mr.Kitayuta,the Treasure Hunter
[题目链接]:http://codeforces.com/problemset/problem/505/C [题意] 一开始你跳一步长度为d; 之后你每步能跳d-1,d,d+1这3种步数; 然后在路上 ...
- Codeforces Round #286 Div.1 A Mr. Kitayuta, the Treasure Hunter --DP
题意:0~30000有30001个地方,每个地方有一个或多个金币,第一步走到了d,步长为d,以后走的步长可以是上次步长+1,-1或不变,走到某个地方可以收集那个地方的财富,现在问走出去(>300 ...
- codeforces 505C Mr. Kitayuta, the Treasure Hunter(dp)
题意:有30001个岛,在一条线上,从左到右编号一次为0到30000.某些岛屿上有些宝石.初始的时候有个人在岛屿0,他将跳到岛屿d,他跳跃的距离为d.如果当前他跳跃的距离为L,他下一次跳跃的距离只能为 ...
- [Codeforces Round#286] A.Mr. Kitayuta, the Treasure Hunter 【Normal DP..】
题目链接:CF#286 - A 这场CF就这样爆零了...我真是太蒟蒻了... 题目分析 比赛的时候看到A题就发现不会,之后一直也没想出来,于是就弃了,还好不提交也不掉Rating... 比赛后看评论 ...
- 505C Mr. Kitayuta, the Treasure Hunter
传送门 题目大意 一共有30000个位置,从第0个位置开始走,第一次走k步,对于每一次走步,可以走上一次的ki+1 ,ki ,ki-1步数(必须大于等于1),每个岛上有value,求最大能得到的val ...
- Codeforces 505C Mr. Kitayuta, the Treasure Hunter:dp【考虑可用范围】
题目链接:http://codeforces.com/problemset/problem/505/C 题意: 有n个宝石,分别在位置p[i].(1 <= n,p[i] <= 30000) ...
- cf 506 A. Mr. Kitayuta, the Treasure Hunter
不知道这个sb题怎么做错了.. /*#include <bits/stdc++.h> #define LL long long using namespace std; inline in ...
随机推荐
- wireshark 报文颜色
在使用wireshark抓包分析的过程中,默认会对不同的包进行着色,截图如下: 对不同的颜色有了解,可快速的过滤包或分析请求. 菜单栏选择视图-->着色规则,即可看到不同颜色代表的含义: 大致可 ...
- 前端开发环境搭建踩坑笔记——npm install node-sass安装失败的解决方案
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- Oracle数据库同时建立和使用两个监听器
1.问题 我分别对两个数据库实例(Lib和Orcl)各自建立了一个监听器,端口号分别为1520和1521,但是默认只启动一个,导致我切换数据库实例的时候, 出现以下问题:状态: 失败 -测试失败: I ...
- 【C++】枚举作为类函数返回值时需定义在使用之前
枚举定义在前,作为函数返回值在后 枚举定义在后,则函数返回值需用普通类型
- Linux-运行级别-init
- 战略设计- DDD
随着系统的增长,它会变得越来越复杂,当我们无法通过分析对象来理解系统的时候,就需要掌握一些操纵和理解大模型的技术了.本文将介绍一些原则.遵循这些原则,就可以对非常复杂的领域进行建模.大部分这样的决策都 ...
- [转帖]SQL Server中查询CPU占用高的SQL语句
本文导读:触发器造成死锁.作业多且频繁.中间表的大量使用.游标的大量使用.索引的设计不合理.事务操作频繁.SQL语句设计不合理,都会造成查询效率低下.影响服务器性能的发挥.我们可以使用sql serv ...
- [转帖]《Linux性能优化实战》笔记(三)—— CPU 上下文切换(下)
上篇介绍了三种CPU 上下文切换以及它们可能造成的问题和原因,这一篇来看看在系统中如何发现CPU 上下文切换问题. 一. 查看上下文切换情况 主要使用两个命令:vmstat以及之前用过的pidstat ...
- [转帖]mvcc多版本并发控制的原理
https://baijiahao.baidu.com/s?id=1751185558149315946 MVCC多版本并发控制的原理:通过undo_log多版本链条,加上开启事务时产生的read ...
- 银河麒麟系统信息获取V1.0版本
银河麒麟系统信息获取 摘要 最近项目有一些兼容性测试需求. 可能需要获取一些系统配置信息便于相关的工作. 想着自己总结一下. 便于后续的不太熟悉的同事进行简要处理 银河麒麟获取版本 nkvers # ...