洛谷p1052过河 路径压缩+dp
洛谷 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的更多相关文章
- 洛谷P1052 过河【线性dp】【离散化】
题目:https://www.luogu.org/problemnew/show/P1052 题意: 青蛙要从0跳到超过$l$的地方,每一次可以跳$s$到$t$之间的任意数. 在河中有m个石头,要求在 ...
- 洛谷 P1052 过河 (离散化+dp)
dp非常好想, f[i] = min(f[i-len] + stone[i]) s <= len <= t 然后因为L非常大,所以我就不知道该怎么搞了 我看到m只有100,而L有1e9,我 ...
- 洛谷P1052 过河
P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...
- 洛谷P1052过河
题目 不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了. 所以我们考虑一下路径压缩. 小数据Code #include <iostream> #include ...
- 洛谷1052(路径压缩后简单dp)
同POJ3744写法都是一样的. 距离太长无意义可以压缩,注意不是随便压的,想一想可以跟%T发生关系. #include <cstdio> #include <cctype> ...
- 洛谷 P1052 过河
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- 洛谷P1002 过河卒【dp】
棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒 ...
- 洛谷 - P1002 - 过河卒 - 简单dp
https://www.luogu.org/problemnew/show/P1002 方程很好想,题目也很暴力.感谢题目提示数据会很大. #include<bits/stdc++.h> ...
- 【题解】洛谷P1052 [NOIP2005TG] 过河(DP+离散化)
题目来源:洛谷P1052 思路 一开始觉得是贪心 但是仔细一想不对 是DP 再仔细一看数据不对 有点大 如果直接存下的话 显然会炸 那么就需要考虑离散化 因为一步最大跳10格 那么我们考虑从1到10都 ...
随机推荐
- 牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP
LINK:牛牛的斐波那契字符串 虽然sb的事实没有改变 但是 也不会改变. 赛时 看了E和F题 都不咋会写 所以弃疗了. 中午又看了一遍F 发现很水 差分了一下就过了. 这是下午和古队长讨论+看题解的 ...
- luogu P4294 [WC2008]游览计划
LINK:游览计划 斯坦纳树例题. 斯坦纳树是这样一类问题:带权无向图上有K个关键点 求出包含这K个点的最小生成树. 也就是说 求最小生成树 但是 并不是整张图 仅限于K个点. 可以发现我们利用克鲁斯 ...
- 痞子衡嵌入式:为下一代智能可穿戴设备而生 - i.MXRT500
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的新品i.MXRT500. 自2018年i.MXRTxxx系列首款芯片i.MXRT600(主打智能语 ...
- PHP开发者该知道的多进程消费队列
引言 最近开发一个小功能,用到了队列mcq,启动一个进程消费队列数据,后边发现一个进程处理不过来了,又加了一个进程,过了段时间又处理不过来了… 这种方式每次都要修改crontab,如果进程挂掉了,不会 ...
- Linux之iptables原理详解
目录: 一.netfilter与iptables 二.filter.nat.mangle等规则表 三.INPUT.FORWARD等规则链和规则 四.Linux数据包路由原理 五.iptables编写规 ...
- day14.推导式与生成器
一.列表推导式 '''通过一行循环判断,遍历一系列数据的方式''' """ 推导式的语法: val for val in Iterable 三种方式: [val for ...
- linux查询操作系统信息,CPU物理个数,CPU核心数,逻辑CPU数,内存信息查询,硬盘信息查询
目录 一.前言 二.关于服务器基本配置 2.1 操作系统基本配置查询 2.2 CPU基本配置查询 2.3 内存基本配置查询 2.4 硬盘基本配置查询 一.前言 当我们接手了一台或者几台服务器的时候 ...
- Linux常用命令之用户权限管理chmod、chown、chgrp、umask命令讲解
这节课我们重点来学习权限管理命令,说到权限大家可能第一时间能想到的就是读.写.执行 rwx 三种权限,在正式讲解权限命令之前,先简单的介绍一下rwx权限对于文件和目录的不同含义. 权限字符 权限 对文 ...
- Hive操作——删除表(drop、truncate)
Hive删除操作主要分为几大类:删除数据(保留表).删除库表.删除分区. 一.仅删除表中数据,保留表结构 hive> truncate table 表名; truncate操作用于删除指定表中的 ...
- axios的post请求返回状态码400
设置拦截 axios.interceptors.request.use((config) => { if (config.method === 'post') { if (!config.isF ...