Luogu P1052 过河 DP

复习复习DP。。。都忘了QAQ...



好了这道题我其实是看题解才会的。。。

方程 f[i]=min(f[i-j]+v[i]) v[i]表示i是不是石头 s<=j<=t

路径压缩引用一下证明From [email protected]_Hu

#include<cstdio>
#include<iostream>
#define R register int
#include<algorithm>
#define R register int
const int N=50010,Inf=0x3f3f3f3f;
using namespace std;
int l,t,s,n,mn=Inf,ans=Inf;
int a[N],f[N],d[N],v[N];
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar()));
    do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret;
}
inline int min(int a,int b) {return a<b?a:b;}
signed main() {
    l=g(),s=g(),t=g(),n=g();
    if(s==t) { R cnt=0;  for(R i=1,x;i<=n;++i) x=g(),cnt+=(x%s==0);
        printf("%d\n",cnt); return 0;
    } for(R i=1;i<=n;++i) a[i]=g(); sort(a+1,a+n+1); d[n+1]=min(l-a[n],100); l=0;
    for(R i=1;i<=n;++i) d[i]=min(a[i]-a[i-1],90),l+=d[i],v[l]=1; l+=d[n+1];
    for(R i=1;i<=l+10;++i) { f[i]=Inf;
        for(R j=s;j<=t;++j) if(i>=j) f[i]=min(f[i],f[i-j]+v[i]);
    } for(R i=l;i<l+10;++i) ans=min(ans,f[i]); printf("%d\n",ans);
}


2019.04.28 慌得一批QAQ

原文地址:https://www.cnblogs.com/Jackpei/p/10783092.html

时间: 2024-10-08 20:59:05

Luogu P1052 过河 DP的相关文章

luogu P1052 过河

先看一下题面. 背景 这道2005年的提高组时至今日仍然评级在提高+/省选-,由此可见这题确实不简单. 虽然都说是很简单的DP了,但是坑点依然很多. 分析 不过我开始并没有看出来是DP. 那自然考虑搜索啦~ 首先考虑搜索在渡河的途中,踩到的最小石子数量. 然而1..10^9长度的桥.就算是O(n)的算法也不能在一秒内出解. 那么尝试去搜搜石子吧? 搜一个石子就需要考虑来源和去路,导致算法更困难了... 那么就只能DP了啊. 以石子分阶段的一维动规,时间复杂度是O(n^2). 最多也只有100×1

P1052 过河[DP]

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

P1052 过河(状态压缩)

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

洛谷P1052 过河 动态规划

洛谷P1052 过河通过观察可以发现 这个点很稀疏 dp 有很长一段距离都是没有用的,那么我们可以采用离散化的思想 把这个距离压缩,但同时还要保证 对答案没有影响 如果 s==t 这时候我们需要特判 只要判断 pos[ i ] % s == 0 就可以知道是否踩到石子 然后因为 最多青蛙一次只跳了 10 假如 s == 9 t == 10 如果两个石子间的距离大于100 我们每次也可以 一步步的慢慢调整 ,其实总共只有10个状态,%10==1 %10==2 %10==3 然后我们就可以把距离 >

noip 2005 luogu cogs P1052 过河 WD

111. [NOIP2005] 过河 ★★★   输入文件:river.in   输出文件:river.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整 数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点: 0 , 1 ,--, L (其中 L 是桥的长度).坐标为 0 的点表示桥的起点,坐标为 L 的点表示桥

洛谷P1244 青蛙过河 DP/思路

又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的人生经验理解能力. 题目想必已知,我就提几点可能会搞错的点吧. 1.题目说了青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D:但却不能跳到A,B上再跳回来.所以不可以脑补成汉内塔那种跳法. 2.青蛙只能跳到比它大1号的青蛙上面,而不是比他大的青蛙就行.所以不可以脑补

洛谷 P1052 过河

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

NOIP2005过河[DP 状态压缩]

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

袋鼠过河---DP

题目:一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远,每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃,河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸.如果无法到达输出-1: 输入:输入分两行,第一行是数组长度N,第二行是每一项的值,用空格分隔: 输