洛谷P1052 过河【线性dp】【离散化】
题目:https://www.luogu.org/problemnew/show/P1052
题意:
青蛙要从0跳到超过$l$的地方,每一次可以跳$s$到$t$之间的任意数。
在河中有m个石头,要求在尽量不要跳到石头的情况下,青蛙最少可能会跳到多少颗石头。
思路:
刚开始很自然的想到就是用dp[i]表示跳到坐标i时最少要跳到多少时候,dp[i]可以用dp[i-(s~t)]转移过来。
但是一看数据范围,坐标最大是1e9,t是10,时间空间都不够。
再一看m范围才100,这种情况下就要想到用离散化。
因为跳的距离大于t和小于t其实是一样的。对于大于t的某数k,一定可以通过跳x次t步再跳k%t步到达k。
对于石头之间距离超过t的,都可以把中间的距离压缩至t~2t之间。
之所以不是0~t是因为,0~s之间的距离是跳不到的但是t~t+s是可以跳到的。他们并不等价。
然后再用上面说的dp就可以了。
#include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iostream> #define inf 0x7fffffff
using namespace std;
typedef long long LL;
typedef pair<string, string> pr; int l, s, t, m;
const int maxn = ;
int stone[maxn];
int dp[maxn * ];
int vis[maxn * ]; int main()
{
scanf("%d%d%d%d", &l, &s, &t, &m);
for(int i = ; i <= m; i++){
scanf("%d", &stone[i]);
}
stone[] = ;stone[m + ] = l;
sort(stone, stone + + m);
int far = ;
for(int i = ; i <= m + ; i++){
if(stone[i] - stone[i - ] > t){
far += (stone[i] - stone[i - ]) % t + t;
}
else{
far += (stone[i] - stone[i - ]);
}
vis[far] = ;
}
vis[far] = ;vis[] = ;
//cout<<far<<endl; memset(dp, 0x3f, sizeof(dp));
dp[] = ; for(int i = ; i <= far + t - ; i++){
for(int j = s; j <= t; j++){
if(i - j >= ){
dp[i] = min(dp[i], dp[i - j] + vis[i]);
}
}
} int ans = ;
for(int i = far; i <= far + t - ; i++){
ans = min(ans, dp[i]);
}
printf("%d\n", ans); return ;
}
洛谷P1052 过河【线性dp】【离散化】的更多相关文章
- 洛谷p1052过河 路径压缩+dp
洛谷 P1052 过河 思路部分可以看这篇博客 我将在这里对其进行一些解释与补充 首先我们先看题 乍一看 这不是模板题吗 然后开开心心的敲了一个简单dp上去 #include<iostream& ...
- 洛谷P1052 过河
P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...
- 洛谷 P1052 过河 (离散化+dp)
dp非常好想, f[i] = min(f[i-len] + stone[i]) s <= len <= t 然后因为L非常大,所以我就不知道该怎么搞了 我看到m只有100,而L有1e9,我 ...
- P1052 过河 线性dp 路径压缩
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- P1052 过河 线性dp
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- 洛谷1052——过河(DP+状态压缩)
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- 洛谷 P1052 过河
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- 洛谷P1052过河
题目 不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了. 所以我们考虑一下路径压缩. 小数据Code #include <iostream> #include ...
- 【题解】洛谷P1052 [NOIP2005TG] 过河(DP+离散化)
题目来源:洛谷P1052 思路 一开始觉得是贪心 但是仔细一想不对 是DP 再仔细一看数据不对 有点大 如果直接存下的话 显然会炸 那么就需要考虑离散化 因为一步最大跳10格 那么我们考虑从1到10都 ...
随机推荐
- POJ1149 PIGS 【最大流 + 构图】
题目链接:http://poj.org/problem?id=1149 PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- 双端队列 【deque】
题目链接:https://ac.nowcoder.com/acm/contest/1071/D 还是第一次简单运用双端队列.顾名思义:队列的头尾都可以进行插入跟删除操作. 存在于头文件 deque 中 ...
- [CF707D]Persistent Bookcase_主席树_bitset
Persistent Bookcase 题目链接:http://codeforces.com/contest/707/problem/D 注释:略. 题解: 发现虽然$q\le 10^5$但是网格是$ ...
- [转帖]curl 的用法指南
curl 的用法指南 作者: 阮一峰 日期: 2019年9月 5日 感谢 腾讯课堂NEXT学院 赞助本站,腾讯官方的前端课程 免费试学. http://www.ruanyifeng.com/blo ...
- [转帖]四个修改Docker默认存储位置的方法
四个修改Docker默认存储位置的方法 https://blog.51cto.com/forangela/1949947 易改乾坤关注0人评论27435人阅读2017-07-22 09:18:48 ...
- 树链剖分 树剖求lca 学习笔记
树链剖分 顾名思义,就是把一课时分成若干条链,使得它可以用数据结构(例如线段树)来维护 一些定义: 重儿子:子树最大的儿子 轻儿子:除了重儿子以外的儿子 重边:父节点与重儿子组成的边 轻边:除重边以外 ...
- 标准库中最值得关注的两个 装饰器是 lru_cache 和全新的 singledispatch(Python 3.4 新增)
clock 装饰器 def clock(func): @functools.wraps(func) def clocked(*args, **kwargs): t0 = time.perf_count ...
- 【记忆化搜索】Happy Happy Prime Prime
题目描述 RILEY VASHTEE: [reading from display] Find the next number in the sequence:313 331 367 ...? Wha ...
- 怎样查看Redis的版本号
Q: 怎样查看Redis版本 A: 下面两条命令都可以查看redis 版本: redis-server --version redis-server -v
- js判断变量是否为整数
//返回false则不为整数数字,返回ture则反之 var isIntNumber=function(val){ if (isNaN(val) || Math.floor(val) != val) ...