过河

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 737    Accepted Submission(s): 48

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
 
Source
 
dp方程很好想  dp[i]=MIN{dp[j]+stone[i]|L-T<=j<=L-S}
由于L很大,无论时间还是空间都是不允许的,我们发现M最多只有100且S,T最大就是10
说明在L很大时石子是很稀疏的,在一大段没有石子的路程中很多的dp[i]都是一样的,我们想到能不能把这段距离给压缩。
当S==T时,跳动的位置都是确定好的我们不能盲目的压缩,只需要统计一下是S倍数位置的石子输出即可。
当S!=T时,如果两个石子间隔大于100,我们将其缩为100,至于为什么是100,其实可以更小这取决与ST大小。
由于这一大段距离没有石子,所以大家的最优解在后面的时候就都一样了。。。前面的几个dp[i]计算出来之后,由于跳动距离的限制,
后面的位置都由这几个位置决定,大家都会选择最优解,所以越往后相似率越高当L很大时就一样了后面的,所以不妨在保持可计算的程度下减小L。
为了防止出错把L也往后延伸了100.
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ql(a) memset(a,0,sizeof(a))
int main()
{
    int L,S,T,N,i,j,k=0;
    int a[105],b[105],dp[10500],vis[10500];
    while(cin>>L>>S>>T>>N){
    memset(dp,inf,sizeof(dp));
    int sb=0; ql(vis);
    if(k!=0) cout<<endl;
        for(i=1;i<=N;++i)
        {
        cin>>b[i];
        if(T==S) {
            if(b[i]%S==0) sb++;
        }
        }
        if(sb) {cout<<sb;continue;}
        sort(b+1,b+1+N);
        a[0]=b[0]=0;b[N+1]=L;
        for(i=1;i<=N+1;++i){
            if(b[i]-b[i-1]>100){
                a[i]=a[i-1]+100;
            }
            else a[i]=a[i-1]+(b[i]-b[i-1]);
            if(i!=N+1) vis[a[i]]++;
        }
        if(a[N+1]!=L) L=a[N+1];
        int ans=inf;
        for(i=1,dp[0]=0;i<=L+100;++i){
           for(j=S;j<=T;++j){
            if(i-j>=0)
                 dp[i]=min(dp[i],dp[i-j]);
           }
           if(vis[i]>0) dp[i]+=vis[i];
        }
         for(i=L;i<=L+100;++i) ans=min(ans,dp[i]);
         cout<<dp[L];
         k++;
    }
    return 0;
}

HDU 4842 距离压缩DP的更多相关文章

  1. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

  2. HDU 4856 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4856 题目大意:有一个迷宫.迷宫里有些隧道,每个隧道有起点和终点,在隧道里不耗时.出隧道就耗时,你的 ...

  3. HDU 5067 (状态压缩DP+TSP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5067 题目大意:蓝翔挖掘机挖石子.把地图上所有石子都运回起点,问最少耗时. 解题思路: 首先得YY出 ...

  4. HDU 3341 状态压缩DP+AC自动机

    题目大意: 调整基因的顺序,希望使得最后得到的基因包含有最多的匹配串基因,使得所能达到的智商最高 这里很明显要用状态压缩当前AC自动机上点使用了基因的情况所能达到的最优状态 我最开始对于状态的保存是, ...

  5. hdu 4539(状态压缩dp)

    题意:曼哈顿距离是指:|x1-x2|+|y1-y2|,只要知道这个概念题意就懂了. 分析:这道题与前面做的几道题有所不同,因为当前行不仅与前一行有关,而且与前两行有关,所以我们开数组的时候还要记录前两 ...

  6. HDU 4640 状态压缩DP 未写完

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4640 解题思路: 首先用一个简单的2^n*n的dp可以求出一个人访问一个给定状态的最小花费,因为这i个 ...

  7. 2016"百度之星" - 初赛(Astar Round2A)1002 / HDU 5691 状态压缩DP

    Sitting in Line Problem Description   度度熊是他同时代中最伟大的数学家,一切数字都要听命于他.现在,又到了度度熊和他的数字仆人们玩排排坐游戏的时候了.游戏的规则十 ...

  8. hdu 5713(状态压缩DP)

    要进行两次dp, 第一个,dp[i],1<=i<=(1<<n) 其中用i的二进制形式表示已选择的点. dp[i] 用来保存i中的点构成一个连通块,边集多少种可能. 转移方程: ...

  9. hdu 1074(状态压缩dp+记录路径)

    题意:给了n个家庭作业,然后给了每个家庭作业的完成期限和花费的实践,如果完成时间超过了期限,那么就要扣除分数,然后让你找出一个最优方案使扣除的分数最少,当存在多种方案时,输出字典序最小的那种,因为题意 ...

随机推荐

  1. MySQL的知识海洋

    第一篇:初识数据库 第二篇:库操作 第三篇:表操作 第四篇:数据操作 第五篇:视图.触发器.存储过程.函数.事物与数据库锁 第六篇:索引原理与慢查询优化 第七篇:pymysql(用python连接以及 ...

  2. python-pdf添加水印

    0.用到两个扩展模块:ReportLab.PyPDF2. 1.创建水印PDF. 1).创建文字水印pdf文件 代码: #encoding=utf-8 #author: walker #date: 20 ...

  3. Windows 10 升级软件 Windows 10 易升

    进入 https://www.microsoft.com/zh-cn/software-download/windows10 点立即更新,弹出如下下载地址. https://download.micr ...

  4. python之celery队列模块

    一.celery队列简介 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery. 1 ...

  5. Openstack(三)Haproxy+Keepalived双机

    3.1部署keepalived 3.1.1下载keepalived源码包,并解压 # wget http://www.keepalived.org/software/keepalived-1.4.2. ...

  6. Selenium之firefox浏览器的启动

    1.编写如下代码 import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; /** ...

  7. Web Services 简介

    通过使用 Web Services,您的应用程序可以向全世界发布信息,或提供某项功能.Web Services 脚本平台需支持 XML + HTTP. Web Services 简介 Web Serv ...

  8. 使用Ajax向服务器端发送请求

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  9. C++ string 类

    标准c++中string类函数介绍 注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为 ...

  10. 2016ACM/ICPC亚洲区沈阳站 Solution

    A - Thickest Burger 水. #include <bits/stdc++.h> using namespace std; int t; int a, b; int main ...