dp方程很简单:

f[i] = min{ f[i-j] } + stone[i]

但是数据10^9太大了,超时超空间,这样只能过30%

来自:http://blog.csdn.net/w19960702123/article/details/40478187

当我们看到10^9与100块石头,和s,t均小于等于10时,我们会想到有的石头间距可能大于t,即要跳好几步才会到达下一块石头的左右处。而我们会发现这些步数是无关紧要的,我们只需要把他们缩小,即在不影响最终结果的基础上mod一下t就行了。

但是为什么要mod t呢?首先,我们可以知道,青蛙最多跳t,由于两石块间的间距远大于t,且这之间没有石头,所以青蛙会以最大的t去走,至少是在第i块石头向后t个距离,到第i+1块向前t个距离处,它会一直跳的(其实不跳t也可以,但是我们想最优,所以青蛙在中间如何跳是无所谓的,那么我们就可以把它极限化,即取t)

解释完mod t,先一步就是推导如何计算了。

既然我们要缩短距离L(L=b[i]-b[i-1])那么我们就需考虑,是不是L的每一个点都能缩。我们利用极限的思想,青蛙跃过一个石头,最多也就到b[i-1]+t处(同理,最少会到b[i] - t ),即 b[i-1]+t 到 b[i] - t 间的距离要缩减。

综上,我们就可以得到一个公式a[i]=a[ i-1]+X , X=(b[i]-t-b[i-1]-t)%t (即缩点后的长度),但是我们怕X会小于t,这样会导致青蛙直接跳过这段距离,所以我们要再加t,即a[i]=a[ i-1]+(b[i]-b[i-1]-2*t)%t +t。

注意:

1.我们只有在L>t 时我们需要缩点

2.不要忘记排序

3.讨论s==t的情况

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int f[],a[],b[],stone[];
int L,s,t,m,ans;
int main()
{
cin>>L>>s>>t>>m;
for(int i=;i<=m;i++)cin>>a[i];
a[]=;
sort(a+,a+m+);
//特判
if(s==t){
for(int i=;i<=m;i++)if(a[i]%t==)ans++;
cout<<ans;
return ;
}
//压缩
a[m+]=L;
for(int i=;i<=m+;i++){
if(a[i]-a[i-]>t)
b[i]=b[i-]+(a[i]-a[i-]-*t)%t+t;
else b[i]=b[i-]+(a[i]-a[i-]);
// cout<<b[i]<<endl;
}
L=b[m+]; memset(stone,,sizeof(stone));
for(int i=;i<=m;i++)stone[b[i]]=;
f[]=;
for(int i=;i<=L+t-;i++)f[i]=0x3f3f3f3f;
//dp
for(int i=;i<L+t;i++)
for(int k=s;k<=t;k++)
if(i-k>=)f[i]=min(f[i-k]+stone[i],f[i]);
//ans
ans=0x3f3f3f3f;
for(int i=L;i<L+t;i++)ans=min(ans,f[i]);
cout<<ans; return ;
}

code1105 过河的更多相关文章

  1. [LeetCode] Frog Jump 青蛙过河

    A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...

  2. [codevs1105][COJ0183][NOIP2005]过河

    [codevs1105][COJ0183][NOIP2005]过河 试题描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青 ...

  3. A*算法 -- 八数码问题和传教士过河问题的代码实现

    前段时间人工智能的课介绍到A*算法,于是便去了解了一下,然后试着用这个算法去解决经典的八数码问题,一开始写用了挺久时间的,后来试着把算法的框架抽离出来,编写成一个通用的算法模板,这样子如果以后需要用到 ...

  4. 袋鼠过河---DP

    题目:一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远,每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5, ...

  5. NOIP2005过河[DP 状态压缩]

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

  6. ACM 过河问题

    过河问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的 ...

  7. NOIP 2005 青蛙过河

    做题记录:2016-08-10 21:58:09 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都 ...

  8. 过河问题nyoj47

    时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边.如果不借助手电筒的话,大家是无论如何也不敢过桥去的.不幸的是 ...

  9. 商人过河问题(DFS)

    问题描述:3个商人带着3个仆人过河,过河的工具只有一艘小船,只能同时载两个人过河,包括划船的人.在河的任何一边,只要仆人的数量超过商人的数量,仆人就会联合起来将商人杀死并抢夺其财物,问商人应如何设计过 ...

随机推荐

  1. python安装openSSL

    首先确定您是否下载python (3).pip (3).python-wheel 官网下载源码包openSSL 参考:用pip安装python 模块OpenSSL

  2. python中的运算符优先级(其它语言也试用)

  3. Anatoly and Cockroaches

    Anatoly lives in the university dorm as many other students do. As you know, cockroaches are also li ...

  4. DevExpress GridControl 单元格添加进度条(ProgressBar)

    首先可以使用DevExpress GridControl 自带的进度条控件. 但是我要用一个方法来设置所以的单元格进度,而不是每个单元格都要设置一遍,同时我想要根据进度值不同,进度条显示不同的颜色. ...

  5. TS流解析 二 *****

    1.TS格式介绍 TS:全称为MPEG2-TS.TS即"Transport Stream"的缩写.它是分包发送的,每一个包长为188字节(还有192和204个字节的包).包的结构为 ...

  6. KMP算法解释

    给定两个字符串A,B,判断T是否为S的子串(变式:寻找子串B在串A中的位置). 要求一个O(|A|+|B|)的做法. 通常称A为目标串(或主串),B为模式串. 算法过程: 我们假设串A的长度为n,串B ...

  7. class文件格式说明

    java代码编译成class文件之后,class文件里面的语法是什么样的,他的数据类型是什么以及如何存放的?? class也是一种语言写的,只不过和我们的java语法不同而已. class文件就是把j ...

  8. [Python] numpy.sum

    import numpy as np #Syntax: numpy.sum(a, axis=None, dtype=None, out=None, keepdims=<class numpy._ ...

  9. Selenium Webdriver——AutoIt和robot实现右键另存

    方案如下: 1.selenium 弹出右键菜单 2.robot选择相关菜单 3.调用autoIt实现windows gui另存操作 test case 如下: 1.打开百度(谷歌浏览器) 2.选择百度 ...

  10. ETL 脚本任务

    Public Sub Main()        '        ' Add your code here        '        Dim sbWA As New StringBuilder ...