洛谷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都 ...
随机推荐
- 读/写docx文件
安装 pip install python-docx 1.建立新Word文档 建立新文档需要调用Document对象的save方法,一个Document对象代表一个Word文档,该方法的参数是保存的文 ...
- C/C++编程笔记:inline函数的总结!C/C++新手值得收藏!
在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间. 在系统下, ...
- 动态修改HttpServletRequest的Post请求参数
需求场景: 公司对APP调用的后台接口有个公用格式如下,外层包含了一些设备.版本.签名信息,主要的业务参数是在body里,外层信息都是在网关解决,验证签名后,在转发body到后台服务. { " ...
- Gradient Centralization: 简单的梯度中心化,一行代码加速训练并提升泛化能力 | ECCV 2020 Oral
梯度中心化GC对权值梯度进行零均值化,能够使得网络的训练更加稳定,并且能提高网络的泛化能力,算法思路简单,论文的理论分析十分充分,能够很好地解释GC的作用原理 来源:晓飞的算法工程笔记 公众号 论 ...
- CentOS 7.0防火墙设置
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙.1.关闭firewall:systemctl stop firewalld.servicesystemctl ...
- 002_go语言的值类型
代码演示: package main import "fmt" func main() { fmt.Println("go"+"lang") ...
- Springboot使用Shiro-整合Redis作为缓存 解决定时刷新问题
说在前面 (原文链接: https://blog.csdn.net/qq_34021712/article/details/80774649)本来的整合过程是顺着博客的顺序来的,越往下,集成的越多,由 ...
- 咕咕咕清单(SCOI2020前)
本篇博客已停更 本篇博客已停更 本篇博客已停更 吐槽区: 2020.04.15: 从今天起我做过的题目都记录一下,想不想写题解就另说了 2020.04.17: 写了两天之后真实的发现这是博主的摸鱼日记 ...
- Socket 模拟HTTP客户端请求
import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import ja ...
- CVE-2020-14644 weblogic iiop反序列化漏洞
0x00 weblogic 受影响版本 Oracle WebLogic Server 12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0 0x01 环境准备 1.安装weblogic ...