P1052 过河 题解
复习dp(迪皮)的时候刷到了一道简单路径压缩的题目(一点不会qwq)
正解:
首先呢,我们看到题目,自然而然的会想到这种思路:
设状态变量dp[i]表示从第一个格子开始经过一些跳跃跳到第i个格子上所踩到的最小石子数目。
那么,根据每一次跳s~t个格子,我们可以得出dp[i]可以从dp[i-t]到dp[i-s]转移过来,要综合考虑的话呢,就要在所有之前的情况中取一个石子数最小的在加上当前位置是否有石子数,就是dp[i]的值。
于是呢,有了整体思路,我们开始敲起了代码。
浏览数组范围时发现了这样一个东西:
awsl
这空间时间都会炸吧。。。
于是乎,我们上述的简单套路就被ban掉了。
开始思考:
我们发现在这种数据下,石子间的间隔变得非常的大。
能不能压缩一下那些多余的路径,但是却对答案没有影响呢?
首先,摘取洛谷题解中一位dalao的做法:
我直接没看,被ex到了。
自己思考:
看了看数据范围:
观察dp式子dp[i]=max(dp[i-t]~dp[i-s])+flag[i];flag[i]表示第i个位置有没有石子。
当一段区间不存在石子时,flag就无用了。
于是说白了,就是个统计最大值的过程一旦统计完dp[i]到dp[i-t]的最大值,其后面flag等于0的情况直接就可以跳过了。
不难想出,统计dp[i]到dp[i-t]这个区间的最大值一共需要lcm(s,t)次。
感性理解。。。
于是我们得出了最短压缩长度90.。?(90=9*10,10,10的情况直接特判就行了)
那么,把多余90的距离都压缩成90一定能保证结果不变。
上代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 214748364
using namespace std;
int read()
{
int ans=;
char ch=getchar(),last=' ';
while(ch>''||ch<'')last=ch,ch=getchar();
while(ch>=''&&ch<='')ans=(ans<<)+(ans<<)+ch-'',ch=getchar();
return last=='-'?-ans:ans;
}
int min(int a,int b){return a<b?a:b;} inline bool cmp(int a,int b)
{return a<b;} int l,s,t,m,sz[],ans,dis[],sum,flag[],dp[]; int main(){
l=read();
s=read(),t=read(),m=read();
if(s==t)
{
int bol;
for(int i=;i<=m;i++)
{
bol=read();ans+=((bol%s)==);
}
printf("%d\n",ans);return ;
}
for(int i=;i<=m;i++)
sz[i]=read();
sort(sz+,sz++m,cmp);
for(int i=;i<=m;i++)
dis[i]=min(sz[i]-sz[i-],);//dis[i]表示第i个石子到第i-1个石子的距离差
dis[m+]=min(l-sz[m],);
for(int i=;i<=m;i++)
sum+=dis[i],flag[sum]=;
sum+=dis[m+];
for(int i=;i<=sum+;i++)
{
dp[i]=maxn;
for(int j=s;j<=t;j++)
{
if(i>=j)dp[i]=min(dp[i],dp[i-j]+flag[i]);
}
}
int minn=maxn;
for(int i=sum;i<=sum+;i++)
{
minn=min(minn,dp[i]);
}
printf("%d",minn);
return ;
}
完结/
也就是说,对于s=t=10的极端情况,只要看100的倍数上有没有石子统计一下就行了。
对于次大的情况s=9,t=10,时,只要把s
P1052 过河 题解的更多相关文章
- 【洛谷】P1052 过河【DP+路径压缩】
P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙 ...
- 洛谷P1052 过河
P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...
- P1052 过河(离散化+dp)
P1052 过河 dp不难,重点是要想到离散化. 石子个数$<=100$意味着有大量空间空置,我们可以缩掉这些空间. 实现的话自己yy下就差不多了. #include<iostream&g ...
- P1052 过河(状态压缩)
P1052 过河(状态压缩) 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把 ...
- 洛谷p1052过河 路径压缩+dp
洛谷 P1052 过河 思路部分可以看这篇博客 我将在这里对其进行一些解释与补充 首先我们先看题 乍一看 这不是模板题吗 然后开开心心的敲了一个简单dp上去 #include<iostream& ...
- luoguP1502过河题解
日常吐(fei)嘈(hua) 这道题作为最近卡了我3天的dp题(最后还是在题解的帮助下冥思苦想才过掉的题),窝觉得此题肥肠之脑洞,写此博客纪念 题解 过河 先来日常手玩样例: 咦感觉怎么手玩答案都像是 ...
- 洛谷 P1052 过河
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- P1052 过河 线性dp 路径压缩
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- P1052 过河 线性dp
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
随机推荐
- 【ARM-Linux开发】Linux下查看机器的CPU负载
负载(load)是Linux机器的一个重要指标,直观了反应了机器当前的状态.如果机器负载过高,那么对机器的操作将难以进行. Linux的负载高,主要是由于CPU使用.内存使用.IO消耗三部分构成.任意 ...
- Union All 使用注意事项和字段顺序不一致导致的异常
使用注意,先说结果: UNION 操作符用于合并两个或多个 SELECT 语句的结果集,这里需要注意的是: UNION 内部的 SELECT 语句必须拥有相同数量的列: 列也必须拥有相似的数据类型(实 ...
- js监听屏幕的高度变化
之前用VUE写完一个聊天界面,对于ios的效果该优化的地方都已经优化,且已上线.现在因项目需要,在另外一个angularjs+ionic的框架也要写一个聊天页面,目前还在开发中,发现忘记了一些很关键的 ...
- codevs 1163:访问艺术馆
题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精 ...
- UWP笔记-自定义Grid背景图片
之前写简单的UWP版本地音乐播放器,有自定义背景壁纸的功能,现在贴在这里回顾下. Page.xaml 页面,添加Grid <Grid x:Name="mainGrid"/&g ...
- 自定义的C4P数据库连接池
要想自己写一个数据库连接池 需要实现DataSoure这个类,然后重写getConnection 这个方法 public class C4p0 implements DataSource{ priva ...
- Oracle的查询-多表查询中的一些概念
--笛卡尔积 select * from emp e,dept d; --等值连接 select * from emp e,dept d where e.deptno=d.deptno --内连接 s ...
- SQLite进阶-13.Autoincrement关键字
目录 AUTOINCREMENT 是一个关键字,用于表中的字段值自动递增.我们可以在创建表时在特定的列名称上使用 AUTOINCREMENT 关键字实现该字段值的自动增加. 关键字 AUTOINCRE ...
- java 分解整数 【个 十 百 千】,获得个位、十位、百位数字
求一个数数的个位数,十位数,百位数及千位: int num = 53; int g = (num / 1) % 10; //个位 int s = (num / 10) % 10; //十位 int ...
- python 基础(十七)--hashlib加密模块
hashlib加密模块 两种方式使用 字符串是中文时需要先编码成utf-8 常用加密算法:md5,sha1(已被破解)等... >>> a= hashlib.md5() >&g ...