洛谷1052——过河(DP+状态压缩)
题目描述
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,…,L0,1,…,L0,1,…,L(其中LLL是桥的长度)。坐标为000的点表示桥的起点,坐标为LLL的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是SSS到TTT之间的任意正整数(包括S,TS,TS,T)。当青蛙跳到或跳过坐标为LLL的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度LLL,青蛙跳跃的距离范围S,TS,TS,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。
输入输出格式
输入格式:
第一行有111个正整数L(1≤L≤109)L(1 \le L \le 10^9)L(1≤L≤109),表示独木桥的长度。
第二行有333个正整数S,T,MS,T,MS,T,M,分别表示青蛙一次跳跃的最小距离,最大距离及桥上石子的个数,其中1≤S≤T≤101 \le S \le T \le 101≤S≤T≤10,1≤M≤1001 \le M \le 1001≤M≤100。
第三行有MMM个不同的正整数分别表示这MMM个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。
输出格式:
一个整数,表示青蛙过河最少需要踩到的石子数。
输入输出样例
输入样例#1:
10
2 3 5
2 3 5 6 7
输出样例#1:
2
说明
对于30%的数据,L≤10000L \le 10000L≤10000;
对于全部的数据,L≤109L \le 10^9L≤109。
2005提高组第二题
思路
如果不考虑数据范围的话,可以很快得出递推关系式:dp[i]=min(dp[i+k]+a[i]) (S≤k≤T)dp[i]=min(dp[i+k]+a[i])\ \ (S\leq k \leq T)dp[i]=min(dp[i+k]+a[i]) (S≤k≤T)(a[i]a[i]a[i]为iii点的石头数dp[i]dp[i]dp[i]表示到达iii点踩到的最少石头数)
然鹅看了数据范围后,时间和空间都是过不去的。所以需要选择别的方法:
当S=TS=TS=T的时候,可以很容易得到:所有在SSS倍数位置上的点,都会走到,所以对该种情况进行特判
我们可以发现石子在桥上放置的是非常稀疏的,而且当点的位置超过一定范围,点都是可以跳到的。所以可以将石子所在的位置压缩到这个范围里去。将压缩后位置储存起来作为新的石头的位置,按照这个位置进行dp即可
假设每次走ppp或者p+1p+1p+1步.我们知道gcd(p,p+1)=1gcd(p,p+1)=1gcd(p,p+1)=1.
由扩展欧几里得可知,对于二元一次方程组:
px+(p+1)y=gcd(p,p+1)px+(p+1)y=gcd(p,p+1)px+(p+1)y=gcd(p,p+1)是有整数解的,即可得:px+(p+1)y=spx+(p+1)y=spx+(p+1)y=s是一定有整数解的。
设px+(p+1)y=spx+(p+1)y=spx+(p+1)y=s的解为:x=x0+(p+1)t,y=y0−ptx=x_0+(p+1)t,y=y_0−ptx=x0+(p+1)t,y=y0−pt。令0≤x≤p0\leq x\leq p0≤x≤p(通过增减ttt个p+1p+1p+1来实现),s>p×(p+1)−1s>p\times (p+1)−1s>p×(p+1)−1,
则有:y=s−pxp+1≥s−p2p+1>p(p+1)−1−pxp+1≥0y=\dfrac {s-px}{p+1}\geq \dfrac {s-p^{2}}{p+1} >\dfrac {p\left( p+1\right) -1-px}{p+1}\geq 0y=p+1s−px≥p+1s−p2>p+1p(p+1)−1−px≥0
即表示,当s≤p×(p+1)s\leq p\times (p+1)s≤p×(p+1)时,px+(p+1)y=spx+(p+1)y=spx+(p+1)y=s有两个非负整数解,每次走ppp步或者p+1p+1p+1步,p×(p+1)p\times (p+1)p×(p+1)之后的地方均能够到达。
如果两个石子之间的距离大于p×(p+1)p\times (p+1)p×(p+1),那么就可以直接将他们之间的距离更改为p×(p+1)p \times (p+1)p×(p+1)。
综上,得到压缩路径的方法:若两个石子之间的距离大于t×(t−1)t\times(t−1)t×(t−1),则将他们的距离更改为t×(t−1)t\times (t−1)t×(t−1)。因为t≤10为t\leq10为t≤10,因此我们可以直接将大于10×910\times910×9的距离直接化为909090.
关于路径压缩常数的选择,证明过程详见:https://blog.csdn.net/qq_34940287/article/details/77494073
AC代码
/*************************************************************************
> Author: WZY
> School: HPU
> Created Time: 2019-02-03 15:55:49
************************************************************************/
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define ms(a,b) memset(a,b,sizeof(a))
#define INF 0x7f7f7f7f
const int maxn=1e6+10;
const int mod=1e9+7;
using namespace std;
int a[maxn];
int dp[maxn];
int vis[maxn];
int main(int argc, char const *argv[])
{
ios::sync_with_stdio(false);
cin.tie(0);
int L;
int ans=0;
int s,t,m;
cin>>L;
cin>>s>>t>>m;
for(int i=1;i<=m;i++)
cin>>a[i];
if(s==t)
{
for(int i=1;i<=m;i++)
{
if(a[i]%s==0)
ans++;
}
cout<<ans<<endl;
return 0;
}
sort(a+1,a+1+m);
int _=90;
int res=a[1]%_;
vis[res]=1;
// 缩点
for(int i=2;i<=m;i++)
{
res+=(a[i]-a[i-1])%_;
vis[res]=1;
}
for(int i=res;i>=0;i--)
{
dp[i]=INF;
for(int j=s;j<=t;j++)
dp[i]=min(dp[i],dp[i+j]+vis[i]);
}
cout<<dp[0]<<endl;
return 0;
}
洛谷1052——过河(DP+状态压缩)的更多相关文章
- NOIP2005过河[DP 状态压缩]
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- 洛谷P2258 子矩阵 题解 状态压缩/枚举/动态规划
作者:zifeiy 标签:状态压缩.枚举.动态规划 题目链接:https://www.luogu.org/problem/P2258 这道题目状态压缩是肯定的,我们需要用二进制来枚举状态. 江湖上有一 ...
- [HDU 4842]--过河(dp+状态压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4842 过河 Time Limit: 3000/1000 MS (Java/Others) Mem ...
- 洛谷P1357 花园(状态压缩 + 矩阵快速幂加速递推)
题目链接:传送门 题目: 题目描述 小L有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为1~N(<=N<=^).他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则,任意相邻 ...
- 洛谷 1052 dp 状态压缩
洛谷1052 dp 状态压缩 传送门 (https://www.luogu.org/problem/show?pid=1052#sub) 做完这道题之后,感觉涨了好多见识,以前做的好多状压题目都是将一 ...
- 洛谷p1052过河 路径压缩+dp
洛谷 P1052 过河 思路部分可以看这篇博客 我将在这里对其进行一些解释与补充 首先我们先看题 乍一看 这不是模板题吗 然后开开心心的敲了一个简单dp上去 #include<iostream& ...
- 洛谷 P1002过河卒
洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...
- P1052 过河(状态压缩)
P1052 过河(状态压缩) 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
随机推荐
- GISer如何突破二次开发瓶颈
年初时写的<一个GISer的使命>那篇文章中,提出了GISer的技术提升路径可以分为四个大的阶段: 阶段一,能使用商业GIS软件去解决问题. 阶段二,能使用开源GIS软件去解决问题. 阶段 ...
- HDFS05 NameNode和SecondaryNameNode
NameNode和SecondaryNameNode(了解) 目录 NameNode和SecondaryNameNode(了解) NN 和 2NN 工作机制 NameNode工作机制 Secondar ...
- A Child's History of England.32
And so, in darkness and in prison, many years, he thought of all his past life, of the time he had w ...
- C++自定义字符串类
//header.h #ifndef _HEADER_H #define _HEADER_H #define defaultSize 128 #include<iostream> #inc ...
- pop回指定控制器
//OCNSArray *array = [NSMutableArray new]; array = self.navigationController.viewControllers; //1.返回 ...
- Spring是如何保证同一事务获取同一个Connection的?使用Spring的事务同步机制解决:数据库刚插入的记录却查询不到的问题(转)
前言 关于Spring的事务,它是Spring Framework中极其重要的一块.前面用了大量的篇幅从应用层面.原理层面进行了比较全方位的一个讲解.但是因为它过于重要,所以本文继续做补充内容:Spr ...
- 2.使用Lucene开发自己的搜索引擎–indexer索引程序中基本类介绍
(1)Directory:Directory类描述了Lucene索引的存放位置,它是一个抽象,其子类负责具体制定索引的存储路径.FSDirectory.open方法来获取真实文件在文件系统中的存储路径 ...
- inode节点
目录 一.简介 二.信息 inode的内容 inode的大小 3.inode号码 三.目录文件 四.硬连接 五.软链接 六.inode的特殊作用 一.简介 理解inode,要从文件储存说起. 文件储存 ...
- logcplus(2)
(一)log4cplus是C++编写的开源的日志系统,功能非常全面,用到自己开发的工程中会比较专业的,:),本文介绍了log4cplus基本概念,以及如何安装,配置. ### 简介 ### log4 ...
- IO多路复用技术总结
来源:微信公众号「编程学习基地」 IO 多路复用概述 I/O 多路复用技术是为了解决进程或线程阻塞到某个 I/O 系统调用而出现的技术,使进程不阻塞于某个特定的 I/O 系统调用. 在IO多路复用技术 ...