题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4842

过河

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)

Problem Description
在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0,1,……,L(其中L是桥的长度)。坐标为0的点表示桥的起点,坐标为L的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是S到T之间的任意正整数(包括S,T)。当青蛙跳到或跳过坐标为L的点时,就算青蛙已经跳出了独木桥。
题目给出独木桥的长度L,青蛙跳跃的距离范围S,T,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。
Input
本题有多组数据。对于每一组数据来说:第一行有一个正整数L(1 <= L <= 109),表示独木桥的长度。第二行有三个正整数S,T,M,分别表示青蛙一次跳跃的最小距离,最大距离,及桥上石子的个数,其中1 <= S <= T <= 10,1 <= M <= 100。第三行有M个不同的正整数分别表示这M个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。
Output
对于每一组数据,单独输出一行,只包括一个整数,表示青蛙过河最少需要踩到的石子数。(输出的最后没有多余的换行)
Sample Input
10
2 3 5
2 3 5 6 7

Sample Output
2
解题思路:由于L太大直接dp那么无论时间上还是空间上都无法通过,那么可以考虑把离散化的石子集中起来
令L=stone[i]-stone[i-1](stone[i]代表按坐标由小到大顺序排列的石块坐标)
当L能够被t整除时(L%t==0),令k=t;当L不能被t整除时(L%t!=0),令k=L%t。然后令k为k+t,
最后判断如果k>L,那么map[]数组中stone[i]和stone[i-1]两石头的距离就被等效成为L(也就是没变);
如果k<=L,那么map[]数组中stone[i]和stone[i-1]两石头的距离就被等效成为k,
可以看出来,这样处理完,两石子最大间距为2*t,大大的缩短了数组,再按解一进行DP,就可以通过了。
在HDU上并没有过,但在学校OJ过了~~~(伤不起啊) http://acm.swust.edu.cn/problem/153/
代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 int stone[101], L, S, T, M, dp[2100], mpt[2100];
 7 int main(){
 8     int i, j, l, k, ptr = 0, minn;
 9     cin >> L >> S >> T >> M;
10     for (i = 1; i <= M; i++)
11         scanf("%d", &stone[i]);
12     memset(mpt, 0, sizeof(mpt));
13     memset(dp, 0, sizeof(dp));
14     sort(stone + 1, stone + 1 + M);
15     stone[0] = ptr = 0;
16     for (i = 1; i <= M; i++){
17         l = stone[i] - stone[i - 1];
18         if (!(l % T)) k = T;
19         else k = l % T;
20         k = k + T;
21         k = min(k, l);
22         ptr = ptr + k;
23         mpt[ptr] = 1;
24     }
25     for (i = 1; i <= ptr + T; i++){
26         minn = 0x7ffffff;
27         for (j = i - T; j <= i - S; j++)
28         if (j >= 0 && dp[j] < minn)
29             minn = dp[j];
30         dp[i] = minn + mpt[i];
31     }
32     minn = 0x7ffffff;
33     for (i = ptr + 1; i <= ptr + T; i++)
34         minn = min(minn, dp[i]);
35     printf("%d\n", minn);
36     return 0;
37 }

View Code

转载于:https://www.cnblogs.com/zyxStar/p/4572455.html

[HDU 4842]--过河(dp+状态压缩)相关推荐

  1. CCF201409-5 拼图(100分)【插头DP+状态压缩】

    试题编号: 201409-5 试题名称: 拼图 时间限制: 3.0s 内存限制: 256.0MB 问题描述: 问题描述 给出一个n×m的方格图,现在要用如下L型的积木拼到这个图中,使得方格图正好被拼满 ...

  2. DP——状态压缩dp

    状态压缩DP 蒙德里安的梦想 分析题目,当我们先摆横着放的方块,再摆放竖着放的方块,当横着放的小方块摆放完后,竖着放的方块也就确定了,因此总方案数应该等于只放横着的小方块的合法方案数.我们考虑每一列可 ...

  3. hdu 3681(bfs+dfs+状态压缩)

    解题思路:这道题属于图上来回走的问题,可以把重复走的过程弱化,即只强调从u->v的结果,中间经过的节点都不考虑.这道题里面'G','F','Y'是重要的节点,其余的点我们是可以忽略的,也就是说, ...

  4. HDU 4407 Sum(容斥原理+状态压缩)

    题目链接 容斥原理不会,map不会,状态压缩不会.做毛线... 题目大意:给出1-n,n个数,有两个操作1是询问x-y区间上与p互质的数的和是多少,2是改变x位置上的数为c. 自己确实办不了,map这 ...

  5. HDU 4628 Pieces(DP + 状态压缩)

    Pieces 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 题目大意:给定一个字符串s,如果子序列中有回文,可以一步删除掉它,求把整个序列删除 ...

  6. 洛谷1052——过河(DP+状态压缩)

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

  7. 【HDU 4352】 XHXJ's LIS (数位DP+状态压缩+LIS)

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. HDU 4997 Biconnected (状态压缩DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4997 题意:一个n个点的完全图中去掉一些边.求这个图有多少个子图是边双联通的.(就是去掉任意一条边之后 ...

  9. HDU 4332 Constructing Chimney [状态压缩+矩阵]

    烟囱是一个3*3的中空构造,给定烟囱的高度,问用1*1*2的砖头搭成这个烟囱有多少种方法. 首先用一个8位二进制数表示某一层的状态.枚举上下两层的状态,判断这两个状态是否可以相邻,上一层必须将下层填满 ...

最新文章

  1. opencv+python机读卡识别(四)百度API进行数字识别
  2. GPU云服务器是什么?谷歌宣布将要推出GPU云服务器
  3. boost::core模块lightweight的测试实例
  4. SpringBoot:ApplicationEvent与ApplicationListener
  5. 【电路仿真】基于matlab Simulink光伏电池仿真模型【含Matlab源码 486期】
  6. 将GitHub源代码打包成jar包
  7. landsat8简介
  8. 安装vs2010 sp1失败
  9. 正则表达式最好的书籍_正则表达式的最佳做法
  10. 【电脑一点通】如何新建和切换Windows桌面
  11. java 限制录入特殊字符_要求输入框里面必须同时含有字母,数字,特殊字符,且不小于8位...
  12. 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)
  13. HIVE 总体标准差stddev()
  14. Linux上安装MySQl超详细教程(CentOS系统)
  15. 华为路由器:一次华为AR1220F-s的系统修复经历
  16. win7 android 双系统平板 p1000,优派Windows7/Android双系统ViewPad 100
  17. 怎样快速实现整篇文档中英互译?这里有简单的方法
  18. ssd的smt_联合评测 | Intel Optane SSD 有效加速 SmartX 超融合在 Oracle 等场景下的系统性能...
  19. Java实现子序列问题
  20. 初识现代资产配置(MPT)理论

热门文章

  1. win10子系统编译android,基于win10子系统ijkplayer全量编译(支持所有格式)流程
  2. c语言实现判断两个子图是否同构问题_经典问题-回溯法-最大团问题
  3. listctrl 优化_上海SEO整站优化公司_新站整站快速排名优化
  4. c语言实现输入输出功能需要调用库函数,C语言学习笔记(二)
  5. 装了python3但在cmd里不识别,Pip无法识别安装命令(Windows 7,Python 3.3)
  6. ntp协议中 服务器失效怎么办,排除网络时间协议(NTP)故障
  7. python行数据切片_通过切片访问DataFrame行
  8. mybatis parameterType
  9. TensorFlow tf.keras.losses.SparseCategoricalCrossentropy
  10. TensorFLow RCNN