洛谷 P1052 过河


思路部分可以看这篇博客

我将在这里对其进行一些解释与补充

首先我们先看题

乍一看

这不是模板题吗

然后开开心心的敲了一个简单dp上去

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1e6;
inline int read(){
int ret=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-f;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
ret=ret*10+(ch^'0');
ch=getchar();
}
return f*ret;
}
long long n;
int vis[maxn];
int s,t,m;
int dp[maxn];
int main(){
// freopen("a.in","r",stdin);
n=read();
s=read();
t=read();
m=read();
int x;
for(int i=1;i<=m;i++){
x=read();
// cin>>x;
vis[x]=1;
}
for(int i=1;i<=n+t-1;i++){
dp[i]=0x3f3f3f;
}
dp[0]=0;
for(int i=1;i<=n+t-1;i++){
int k;
if(i-s>=0){
if(i<=t)
k=0;
else{
k=i-t;
}
for(int j=k;j<=i-s;j++){
dp[i]=min(dp[i],dp[j]+vis[i]);
}
}
else continue;
}
int ans=0x3f3f3f3f;
for(int i=n;i<=n+t-1;i++){
if(ans>dp[i])
ans=dp[i];
}
cout<<ans;
return 0;
}

然后就喜提 30分

仔细一看题目

数据范围1e9,自然

我们需要对dp进行优化

我们再一看,石子的数量小于等于100,便想到了路径压缩(我是废物,没想到)

至于怎样路径压缩,上面那篇博客有讲,我在此进行一些解释与补充

先贴我的代码吧

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
const int maxn=1e6;
inline int read(){
int ret=0;
int f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'){
f=-f;
}
ch=getchar();
}
while(ch>='0'&&ch<='9'){
ret=ret*10+(ch^'0');
ch=getchar();
}
return f*ret;
}
long long n;
int a[maxn];
int s,t,m;
int v[maxn];
int dp[maxn];
int main(){
n=read();
s=read();
t=read();
m=read();
for(int i=1;i<=m;i++){
a[i]=read();
}
if(s==t){
int ans=0;
for(int i=1;i<=m;i++){
if(a[i]%s==0)
ans++;
}
cout<<ans;
return 0;
}
sort(a,a+1+m);
int cnt=0;
for(int i=1;i<=m;i++){
int l=a[i]-a[i-1];
if(l>=t){
cnt+=l%t+t;
}
else {
cnt+=a[i]-a[i-1];
}
v[cnt]=1;
}
memset(dp,0x3f3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=cnt+t-1;i++){
int e;
if(i-s>=0){
if(i<=t)
e=0;
else{
e=i-t;
}
for(int j=e;j<=i-s;j++){
dp[i]=min(dp[i],dp[j]+v[i]);
}
}
else continue;
}
int ans=0x3f3f3f3f;
for(int i=cnt;i<=cnt+t-1;i++){
if(ans>dp[i])
ans=dp[i];
}
cout<<ans;
return 0;
}

这里我要解释几点

1,青蛙只要跳出这个桥,就算过河了,没必要经过桥的终点

所以观察我们最后选最小的过程,就可以发现我们的边界为cnt+t-1


2,我们通过路径压缩,在到达性不变的前提下,缩小讨论长度,缩小原本数据范围,达到时间优化

优化后就转变为较为简单的DAG上的dp;

3,路径压缩的方法较多,我们本质上要保证压缩后的可到性,也就是说,不能采取压缩前一点可到,压缩后不可到的情况,由此可知,我们将模数改为s便为错误情况(至于我为什么知道,因为我改完后wa了)

洛谷p1052过河 路径压缩+dp的更多相关文章

  1. 洛谷P1052 过河【线性dp】【离散化】

    题目:https://www.luogu.org/problemnew/show/P1052 题意: 青蛙要从0跳到超过$l$的地方,每一次可以跳$s$到$t$之间的任意数. 在河中有m个石头,要求在 ...

  2. 洛谷 P1052 过河 (离散化+dp)

    dp非常好想, f[i] = min(f[i-len] + stone[i]) s <= len <= t 然后因为L非常大,所以我就不知道该怎么搞了 我看到m只有100,而L有1e9,我 ...

  3. 洛谷P1052 过河

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...

  4. 洛谷P1052过河

    题目 不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了. 所以我们考虑一下路径压缩. 小数据Code #include <iostream> #include ...

  5. 洛谷1052(路径压缩后简单dp)

    同POJ3744写法都是一样的. 距离太长无意义可以压缩,注意不是随便压的,想一想可以跟%T发生关系. #include <cstdio> #include <cctype> ...

  6. 洛谷 P1052 过河

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  7. 洛谷P1002 过河卒【dp】

    棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒 ...

  8. 洛谷 - P1002 - 过河卒 - 简单dp

    https://www.luogu.org/problemnew/show/P1002 方程很好想,题目也很暴力.感谢题目提示数据会很大. #include<bits/stdc++.h> ...

  9. 【题解】洛谷P1052 [NOIP2005TG] 过河(DP+离散化)

    题目来源:洛谷P1052 思路 一开始觉得是贪心 但是仔细一想不对 是DP 再仔细一看数据不对 有点大 如果直接存下的话 显然会炸 那么就需要考虑离散化 因为一步最大跳10格 那么我们考虑从1到10都 ...

随机推荐

  1. Python os.major() 方法

    概述 os.major() 方法用于从原始的设备号中提取设备major号码 (使用stat中的st_dev或者st_rdev field).高佣联盟 www.cgewang.com 语法 major( ...

  2. PHP setlocale() 函数

    实例 设置地区为 US English,然后再设置回系统默认: <?php高佣联盟 www.cgewang.comecho setlocale(LC_ALL,"US");ec ...

  3. luogu P6224 [BJWC2014]数据 KD-tree 标准板子 重构+二维平面内最近最远距离查询

    LINK:数据 这是一个我写过的最标准的板子. 重构什么的写的非常的标准 常数应该也算很小的. 不过虽然过了题 我也不知道代码是否真的无误 反正我已经眼查三遍了... 重构:建议先插入 插入过程中找到 ...

  4. 牛客挑战赛39 D 牛牛的数学题 NTT FMT FWT

    LINK:牛牛的数学题 题目看起来很不可做的样子. 但是 不难分析一下i,j之间的关系. 对于x=i|j且i&j==0, i,j一定是x的子集 我们可以暴力枚举子集来处理x这个数组. 考虑 x ...

  5. mit-6.828 Lab01:Booting a PC Part2 理论知识

    Part 2 目录 Part 2 学习理论知识 反汇编 扇区 BIOS 启动过程总结 Boot loader启动过程总结 A20 gate 读boot/boot.S 和 boot/boot.c源码 - ...

  6. Spring 方法替换 了解一下

    其实说简单的就是一个A   Bean 在执行本方法的时候并不执行,而是调用另一个B    Bean方法 要求B  implements MethodReplacer @Override public ...

  7. RxJS 中的观察者和迭代器模式

    目录 前言 观察者模式 迭代器模式 RxJS 中两种模式的结合和实现 小结 参考 1. 前言 RxJS 是一个库,它通过使用observable(可观察对象)序列来编写异步和基于事件的程序.其结合了观 ...

  8. Android Studio--Activity实现跳转功能

    首先,完成一个布局文件,名字就叫做activity_text_view.xml <?xml version="1.0" encoding="utf-8"? ...

  9. Android Studio简单的登陆界面

    在app->src->main->java里面找到MainActivity.java,将鼠标放到activity-main上按住Ctrl后单击跳转到activity-main.xml ...

  10. java 接口二

    一 接口的多实现 接口最重要的体现:解决多继承的弊端.将多继承这种机制在java中通过多实现完成了. interface Fu1 { void show1(); } interface Fu2 { v ...