复习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 过河 题解的更多相关文章

  1. 【洛谷】P1052 过河【DP+路径压缩】

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙 ...

  2. 洛谷P1052 过河

    P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...

  3. P1052 过河(离散化+dp)

    P1052 过河 dp不难,重点是要想到离散化. 石子个数$<=100$意味着有大量空间空置,我们可以缩掉这些空间. 实现的话自己yy下就差不多了. #include<iostream&g ...

  4. P1052 过河(状态压缩)

    P1052 过河(状态压缩) 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把 ...

  5. 洛谷p1052过河 路径压缩+dp

    洛谷 P1052 过河 思路部分可以看这篇博客 我将在这里对其进行一些解释与补充 首先我们先看题 乍一看 这不是模板题吗 然后开开心心的敲了一个简单dp上去 #include<iostream& ...

  6. luoguP1502过河题解

    日常吐(fei)嘈(hua) 这道题作为最近卡了我3天的dp题(最后还是在题解的帮助下冥思苦想才过掉的题),窝觉得此题肥肠之脑洞,写此博客纪念 题解 过河 先来日常手玩样例: 咦感觉怎么手玩答案都像是 ...

  7. 洛谷 P1052 过河

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  8. P1052 过河 线性dp 路径压缩

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  9. P1052 过河 线性dp

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

随机推荐

  1. 最新 浪潮java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.浪潮等10家互联网公司的校招Offer,因为某些自身原因最终选择了浪潮.6.7月主要是做系统复习.项目复盘.LeetCode ...

  2. SpringBoot异步编程

    异步调用:当我们执行一个方法时,假如这个方法中有多个耗时的任务需要同时去做,而且又不着急等待这个结果时可以让客户端立即返回然后,后台慢慢去计算任务.当然你也可以选择等这些任务都执行完了,再返回给客户端 ...

  3. vue用echarts 画3d地球 且画线

    页面效果如下: 项目结构如下: 引入的包 "dependencies": { "core-js": "^3.3.2", "regi ...

  4. @KafkaListener和@KafkaListeners的使用

    2. consumer 使用了@KafkaListener注解. 2.1. pom.xml 引入以下依赖 <dependency> <groupId>org.springfra ...

  5. 在文件每行后边添加固定文本(shell)

    例子: 对/code/shell/servers 中每一行最后添加用户名和密码   原来长这样: /code/shell/servers 我对其每行添加" root 950102DK&quo ...

  6. 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理

    目录 学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理 17.1 计划任务-at-cron-计划任务使用方法 17.1.1 at计划任务的使用 17.1.2 查看和删除at将要执行 ...

  7. 使用pycharm开发web——django2.1.5(一)入坑尝试第一步,基本搭建

    首先,接触python的人应该都会用pip 来安装需要的包吧(------>>>>)默认 在运行中使用python -m django --version来检查自己的djang ...

  8. IPv4

    1.IPv4分类地址 PC0(192.168.0.1) 和PC1(172.168.0.1)如果要ping通的话需要设置各自网关 PC0  设置IP  和  默认网关=路由器设置IP 2.Gigabit ...

  9. jupyter的控件交互

    jupyter实现控件交互 jupyter notebook 是一个交互式IDE 直接上jupyter notebook界面截图

  10. 高性能网站建设之 MS Sql Server数据库分区

    什么是数据库分区?数据库分区是一种对表的横向分割,Sql server 2005企业版和之后的Sql server版本才提供这种技术,这种对表的横向分割不同于2000中的表分割,它对访问用户是透明的, ...