洛谷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都 ...
随机推荐
- mingw-w64 gcc std::thread 行为异常
我用的 ming-w64 gcc 是通过 MSYS2 安装的,包名是 mingw-w64-x86_64-gcc,版本 9.2.0-2. 我发现 std::thread 行为异常. int main() ...
- C语言字符串替换
void exchg(char * str) { if(str == NULL) return; int len = strlen(str); char tmp; for(int i=0,j=len- ...
- Go语言学习之斐波那契数列的测试例子和定义常量方法
### Go语言学习之斐波那契数列的测试例子和定义常量方法 1.go语言中测试文件必须以test.go结尾,比如:fib_test.go 2.测试文件内的方法必须是Test开头,比如:func Tes ...
- hyper-v虚拟机centos7网络配置
原文地址:https://jingyan.baidu.com/article/91f5db1b0279bd1c7e05e377.html hyper-v安装了centos7之后并不能上网,这里简单介绍 ...
- Beautifulsoup模块基础用法详解
目录 Beautifulsoup模块 官方中文文档 介绍 基本使用 遍历文档树 搜索文档树 五种过滤器 **find_all( name , attrs , recursive , text , ** ...
- LibSVM格式简介
对于训练或预测,XGBoost采用如下格式的实例文件: train.txt 1 101:1.2 102:0.03 0 1:2.1 10001:300 10002:400 0 0:1.3 1:0.3 1 ...
- varnish HTTP头
Cache-Control:指定了缓存如何处理内容.varnish关心max-age参数,并用它来计算对象的TTL.“Cache-Control:no-cache”是被忽略的.Age:varnish添 ...
- eventFlow 系列 <一> 入门
var exampleId = ExampleId.New; var commandBus = resolver.Resolve<ICommandBus>(); ,) var execut ...
- git merge 命令的使用
我们把dev分支的工作成果合并到master分支上: $ git merge dev Updating d46f35e..b17d20e Fast-forward readme.txt | 1 + 1 ...
- SQL连接(join)
INNER JOIN:如果表中有至少一个匹配,则返回行 LEFT JOIN:即使右表中没有匹配,也从左表返回所有的行 RIGHT JOIN:即使左表中没有匹配,也从右表返回所有的行 FULL JOIN ...