过河
题目描述
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。

题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。

输入描述:
第一行有一个正整数L(1<=L<=10^9),表示独木桥的长度。
第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1<=S<=T<=10,1<=M<=100。
第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。
所有相邻的整数之间用一个空格隔开。

输出描述:
只包括一个整数,表示青
蛙过河最少需要踩到的石子数。

示例1
输入

10
2 3 5
2 3 5 6 7

输出

2

备注:
对于30%的数据,L<=10000;
对于全部的数据,L<=10^9。

题目解析:

题目一开始拿到手的时候,想到这是一道线性动态规划。
然后考虑数组的形态,因为需要判断石子的状态故我们选用一维数组。
有转移方程dp[i] = min(dp[i], dp[i - j] + vis[i])(dp[i] 表示第 i 个位置跳的最小石头数,vis数组判断当前位置是否有石子)

然后……看到那么大的数据愣是没写出来。

看了题解才知道这道题是离散化+dp

这是第一次在题目里碰到过离散化,大家可能都听过离散化,大概知道就像数轴里的每个点,一个个分散的意思,但是要放在这道题目里要怎么去运用呢?

  1. 观察数组范围。
    这道题中青蛙可以跳的范围1<=S<=T<=10,石子个数1<=M<=100,属于很小的数据;反观桥长L<=10^9,数据很大。
    桥的距离很长,但是石子少,可得出结论:两颗石子之间可能存在很远的距离。
    而这道题中离散化的作用就是要 将超长区间压缩,但转换过程中必须保持相对相同。
  2. 确定离散化压缩的具体数值。
    本题最大的S×T的取值是9×10,也就是说让任意两个距离大于90的石头距离为90即可。
    同理,两个点之间的距离大于S * T,直接把距离压缩成S * T。

代码

特判S==T :算出位置能被s整除的石子个数;若不等离散化。
因为起点确定,终点不确定,故可逆推。

#include <bits/stdc++.h>
using namespace std;const int maxn = 2e5 + 5;
int l, s, t, m, dis;
int a[maxn], dp[maxn], vis[maxn];int main() {cin >> l >> s >> t >> m;for (int i = 1; i <= m; i++) cin >> a[i];if (s == t) {       //特判,直接计算位置能被S整除的石子个数int ans = 0; for (int i = 1; i <= m; i++)if (a[i] % s == 0) ans++;cout << ans << '\n';return 0;}sort(a+1, a+m+1);   //排序石子位置 int len = s * t;    //设定离散化长度for (int i = 1; i <= m; i++) {int d = a[i] - a[i-1];if (d > len) d = len;    //两石子距离超过S*T就压缩为S*T dis += d;         //算出离散化后的桥总长 vis[dis] = 1;     //当前位置状态为1(1有石子,0为无) }for (int i = dis; i >= 0; i--) {dp[i] = 100;for (int j = s; j <= t; j++)dp[i] = min(dp[i], dp[i+j] + vis[i]);}cout << dp[0] << endl;
}

过河(dp+离散化)相关推荐

  1. [HDU 4842]--过河(dp+状态压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4842 过河 Time Limit: 3000/1000 MS (Java/Others)    Mem ...

  2. tyvj 1059 过河 dp

    P1059 过河 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2005 提高组 第二道 描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳 ...

  3. HDU 6447 YJJ's Salesman(树状数组优化DP + 离散化)

    HDU 6447 YJJ's Salesman 题目 给一个二维数组,从(0,0)走到(1e9, 1e9).每次只能走右,下,右下,三个方向.其中只有通过右下走到特定给出的点(村庄)时才会获得分值.问 ...

  4. poj3666(基础dp+离散化)

    题目链接:http://poj.org/problem?id=3666 Making the Grade Time Limit: 1000MS   Memory Limit: 65536K Total ...

  5. *POJ3666.Making the Grade(DP+离散化)

    题目链接:http://poj.org/problem?id=3666 题意:求将一个序列调整成纯单调(可以相等)的序列所需要的最小代价 解题思路: 分两种情况讨论: ①不减序列:dp[i][j]表示 ...

  6. poj3666(DP+离散化)

    题目链接:http://poj.org/problem?id=3666 思路: 看了讨论区说本题的数据比较弱,只需要考虑不减序列即可,比较懒,所以我也只写了这一部分的代码,思路都一样,能AC就行了. ...

  7. P4945-最后的战役【dp,离散化】

    正题 题目大意:https://www.luogu.org/problemnew/show/P4945 题目大意 第isi\ si s可以 获取1∼i1\sim i1∼i中最大的能量 获取1∼i1\s ...

  8. P2101-命运石之门的选择【dp,离散化】

    前言 我切掉这道题是命运石之门的选择 正题 题目链接:https://www.luogu.org/problemnew/show/P2101 题目大意 nnn个连在一起的高度hih_ihi​盒子.一个 ...

  9. 洛谷P1244 青蛙过河 DP/思路

    又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的 ...

最新文章

  1. php 英文小写变大写,PHP英文字母大小写转换函数
  2. Spring中的JDBC操作
  3. 为什么不能在init和dealloc函数中使用accessor方法
  4. Excel打开csv文件显示乱码问题解决方法
  5. 碎片化学习不是学习碎片,看这篇了解碎片化学习的真相
  6. 假如有人在今天炸了支付宝的存储服务器...
  7. C#多线程学习之:Monitor类
  8. IBM Holosofx 进行业务流程管理
  9. npm安装typescript
  10. 【深度学习】基于PyTorch搭建ResNet18、ResNet34、ResNet50、ResNet101、ResNet152网络
  11. 关于fat32分区32g限制的问题
  12. GTK+ GUI库使用现状
  13. iOS动画专题·UIView二维形变动画与CAAnimation核心动画
  14. 腾讯乐固多渠道打包配置
  15. 中兴机试 通信算法方向 秋招春招
  16. 2、java语言基础课程2
  17. 计算机c语言入门.ppt,计算机c语言入门经典
  18. matlab中如何输入积分,在matlab中怎么输入特殊符号,Matlab的符号积分
  19. PacketTrace基本使用
  20. lvgl cont(容器)

热门文章

  1. Eclipse导入android项目包xml报错
  2. Java技巧:提高J2SE性能的代码技巧
  3. 人与人之间关系的随想
  4. [Node.js] 模块化 -- express模块
  5. JQuery源码笔记jQuery.access研究学习(13)
  6. jQuery中bind,live,delegate与one方法的用法及区别
  7. HTML-盒子模型(padding-margining)-样式继承-浮动
  8. Tips--解决安装完Anaconda没有快捷方式的问题
  9. 阿里云自动java和mysql数据库_阿里云服务器之基于Linux系统部署上线JavaWeb项目和连接MySQL数据库(从购买云服务器到发布JavaWeb项目全套详细流程)...
  10. Exchange日志清理