描述

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

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

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

格式

输入格式

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

输出格式

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

样例1

样例输入1[复制]

  1. 10
  2. 2 3 5
  3. 2 3 5 6 7

样例输出1[复制]

  1. 2
 

题意:青蛙可以跳在石子或者平路上,给定跳跃最小s和最大长度t,问跳过桥时最少跳到几次石头上。

思路:样例看了很久才看懂。此题给出的石子个数只有100规模,而桥长却又1e9,按一般思路空间时间都有问题,那么问题在于如何优化石头和石头之间的这段路了,我们可以选取一个数,将石头的位置离散化,显然这个数必须是所有可能的跳跃长度的最小公倍数

不然无法转移到最后上。DP方程很简单\( dp[i] = min(dp[i-j](s<=j <=t)+is[i],dp[i]) \)

  1. /** @Date : 2016-12-04-17.15
  2. * @Author : Lweleth (SoungEarlf@gmail.com)
  3. * @Link : https://github.com/
  4. * @Version :
  5. */
  6.  
  7. #include<bits/stdc++.h>
  8. #define LL long long
  9. #define PII pair
  10. #define MP(x, y) make_pair((x),(y))
  11. #define fi first
  12. #define se second
  13. #define PB(x) push_back((x))
  14. #define MMG(x) memset((x), -1,sizeof(x))
  15. #define MMF(x) memset((x),0,sizeof(x))
  16. #define MMI(x) memset((x), INF, sizeof(x))
  17. using namespace std;
  18.  
  19. const int INF = 0x3f3f3f3f;
  20. const int N = 1e5+20;
  21. const double eps = 1e-8;
  22.  
  23. const int zip = 2520;//lcm(1, 2~10) = 2520 为了能够转移到最后一个位置,必须是s~t的公倍数
  24. int a[120];
  25. int is[zip * 120];
  26. int dp[zip * 120];
  27.  
  28. int gcd(int a, int b)
  29. {
  30. return b?gcd(b, a % b):a;
  31. }
  32. int lcm(int a, int b)
  33. {
  34. return a * b/gcd(a, b);
  35. }
  36.  
  37. void cal()
  38. {
  39. int ans = 1;
  40. for(int i = 2; i <= 10; i++)
  41. ans = lcm(ans, i);
  42. cout << ans << endl;
  43. }
  44.  
  45. int main()
  46. {
  47. //cal();
  48. int l;
  49. int s, t, m;
  50. cin >> l >> s >> t >> m;
  51. for(int i = 1; i <= m; i++)
  52. scanf("%d", a + i);
  53. sort(a + 1, a + 1 + m);
  54.  
  55. MMF(is);
  56. MMI(dp);
  57. int cnt = 0;
  58. a[0] = 0;
  59. for(int i = 1; i <= m; i++)//压缩长度
  60. {
  61. int dis = a[i] - a[i - 1];
  62. a[i] = a[i - 1] + dis % zip;
  63. is[a[i]] = 1;
  64. }
  65.  
  66. dp[0] = 0;
  67. for(int i = s; i <= zip * 110; i++)
  68. {
  69. //cout << is[i] << " ";
  70. for(int j = s; j <= t; j++)
  71. {
  72. if(i - j >= 0)
  73. {
  74. dp[i] = min(dp[i], dp[i - j] + is[i]);
  75. }
  76. }
  77. }
  78. printf("%d\n", dp[zip * 110]);
  79. return 0;
  80. }

vijos 1002 简单压缩+DP的更多相关文章

  1. Vijos 1002 过河 状态压缩DP

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

  2. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  3. [动态规划]状态压缩DP小结

     1.小技巧 枚举集合S的子集:for(int i = S; i > 0; i=(i-1)&S) 枚举包含S的集合:for(int i = S; i < (1<<n); ...

  4. POJ 3311 Hie with the Pie(Floyd+状态压缩DP)

    题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...

  5. hdu 4057(ac自动机+状态压缩dp)

    题意:容易理解... 分析:题目中给的模式串的个数最多为10个,于是想到用状态压缩dp来做,它的状态范围为1-2^9,所以最大为2^10-1,那我们可以用:dp[i][j][k]表示长度为i,在tri ...

  6. HDU1565+状态压缩dp

    简单的压缩状态 dp /* 状态压缩dp 同hdu2167 利用滚动数组!! */ #include<stdio.h> #include<string.h> #include& ...

  7. POJ1185 - 炮兵阵地(状态压缩DP)

    题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  8. POJ3254 - Corn Fields(状态压缩DP)

    题目大意 给定一个N*M大小的土地,土地有肥沃和贫瘠之分(每个单位土地用0,1来表示贫瘠和肥沃),要求你在肥沃的单位土地上种玉米,如果在某个单位土地上种了玉米,那么与它相邻的四个单位土地是不允许种玉米 ...

  9. Victor and World(spfa+状态压缩dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 Victor and World Time Limit: 4000/2000 MS (Java/ ...

随机推荐

  1. vue学习笔记之:为何data是一个方法

    vue学习笔记之:为何data是一个方法 在vue开发中,我们可以发现,data中的属性值是在function中return出来的.可为何data必须是一个函数呢?我们先看官方的解释: 当一个组件被定 ...

  2. Python中的名字隐藏

    Python对于module文件中的name是没有private和public区分的,严格来说,在module文件重定义的任何name,都可以被外界访问.但是,对于 from module imort ...

  3. c# 生成的没用文件

    1.pdb 2.vhost 3.application 4.含有更新功能(更新文件夹)

  4. c# 删除word文档中某一页

    object objPage = 14; int pages = oDoc.ComputeStatistics(Microsoft.Office.Interop.Word.WdStatistic.wd ...

  5. 寒假作业end

    开始写博客的个人体会 自己打的链表过不了,果然,心存侥幸是不行的,被揪出来也不错,很感谢畅畅酱. 学术诚信的重要性 爱因斯坦说过:"大多数人说是才智造就了伟大的科学家,他们错了,是人格.&q ...

  6. 活学活用wxPython

    http://www.czug.org/python/wxpythoninaction/

  7. 转 【.NET平台下使用MongoDB入门教程】

    目录 一.了解MongoDB 二.MongoDB特点 三.安装及常用命令 3.1 下载安装 3.2 启动服务器 3.3 常用操作 3.4 其他命令 3.5 做成windows服务 四.批处理程序开启M ...

  8. 实验吧编程题:Hashkill

    原题:6ac66ed89ef9654cf25eb88c21f4ecd0是flag的MD5码,(格式为ctf{XXX_XXXXXXXXXXX_XXXXX})由一个0-1000的数字,下划线,纽约的一个区 ...

  9. html超出不自动换行

    1.使用overflow: hidden把超出的内容进行隐藏: 2.然后使用white-space: nowrap设置内容不换行: 3.最后使用text-overflow: ellipsis设置超出内 ...

  10. [OS] CPU调度

    调度准则 为了比较CPU调度算法,分析员提供了许多准则,用于比较的特征对确定最佳算法有很大影响.这些准则包括: ·CPU使用率:需要使CPU尽可能忙. ·吞吐量:一个时间单元内完成进程的数量. ·周转 ...