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. 神之编辑器emacs

    vim被称之为编辑器之神,而emacs被成为神之编辑器. 可以当编辑器,也可以当做编译器. 编辑好后保存 输入 M-x shell 可以编译文件 g++ test.cpp -o test ./test ...

  2. Bootstrap文件上传组件

    前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签, ...

  3. 《DSP using MATLAB》Problem 3.1

    先写DTFT子函数: function [X] = dtft(x, n, w) %% --------------------------------------------------------- ...

  4. TCP和UDP Client 代码

    最近学习要求做网络编程,使用从网上找了一些资料,主要是网络协议的分层等通讯,你可以查看英文版的资料:CScharp网络编程英文版 下面直接给出代码吧,我想一看应该就懂. TCP Client 代码: ...

  5. sysstat工具

    sysstat工具可以监控系统的IO,CPU,SWAP,LOAD,NETWORK,DISK 安装后,系统会生成定时任务脚本 路径:/etc/cron.d/sysstat 内容: # Run syste ...

  6. 【monkey】mokey常用命令<一>

    monkey测试的相关的原理 monkey测试的原理就是利用socket通讯的方式来模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常.当Monkey程序在模拟器或设备运行的时候,如果 ...

  7. WinForm 弹窗

    private void FrmMyShow_Load(object sender, EventArgs e) { Rectangle r = Screen.GetWorkingArea(this); ...

  8. python 书籍推荐 二

    Python是一中面向对象的编程语言,语法简洁而清晰,具有丰富和强大的类库.对于初学编程者来说,首选Python是个非常棒的选择.   工具/原料 Python Python学习前的准备 1 学习任何 ...

  9. 最长上升子序列(LIS)n2 nlogn算法解析

    题目描述 给定一个数列,包含N个整数,求这个序列的最长上升子序列. 例如 2 5 3 4 1 7 6 最长上升子序列为 4. 1.O(n2)算法解析 看到这个题,大家的直觉肯定都是要用动态规划来做,那 ...

  10. C++ 类外定义

    类内定义与内联函数 像下面这种函数名与函数体都写在类里面的函数形式被称作类内定义,编译器编译的时候会把它默认成内联函数. class Student { public: void setAge(int ...