洛谷 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. 性能测试必备知识(7)- 深入理解“CPU 使用率”

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 回顾 CPU 使用率是单位时间内 CPU 使 ...

  2. The Google File System(论文阅读笔记)

    概述 ​ GFS:一个可扩展的分布式文件系统,用于大型分布式数据相关应用,TB级的数据,成千上万的并发请求. 设计概览 假设 组件的失效比异常更加常见 多数的文件修改操作是追加数据而不是重写原来的数据 ...

  3. math库常用函数

  4. PHP imagealphablending - 设定图像的混色模式

    imagealphablending — 设定图像的混色模式.高佣联盟 www.cgewang.com 语法 bool imagealphablending ( resource $image , b ...

  5. C++中unordered_map几种按键查询比较

    unorder_map有3种常见按键查值方法. 使用头文件<unordered_map>和<iostream>,以及命名空间std. 第一种是按键访问.如果键存在,则返回键对应 ...

  6. python 变量的命名规则和注意事项

    命名规则 变量名只能包含字母.数字和下划线.变量名可以字母或下划线打头,但不能以数字打头,例如,可将变量命名为message_1,但不能将其命名为1_message 变量名不能包含空格,但可使用下划线 ...

  7. 【BalticOI2003】Gem 题解(树形DP)

    题目大意: 给树上每一个结点赋值(值为正整数),要求相邻结点的权值不能相同.问树上最小权值和.$n\leq 10000$. ------------------------- 设$f[i][j]$表示 ...

  8. GitHub 热点速览 Vol.31:在?跑个 GitHub 评分如何?

    摘要:个性化的 GitHub README 自从 7 月上线之后一直风靡在各大技术平台,当中最有意思的莫过于代表你技术的 GitHub Readme Stats 了,除了能显示你提交的 pr.comm ...

  9. CI4框架应用五 - 加载视图

    这节我们来看一下CI4框架中视图的加载, CI4中提供了几种方式加载视图. 1. 利用CI4框架提供的全局函数view(‘模板名’),如果需要传参数可以在第二个参数传一个数组 我们先修改一下之前定义的 ...

  10. MyFirstJavaWeb

    源代码: Register.jsp <%@ page language="java" contentType="text/html; charset=utf-8&q ...