Luogu P1052 过河 DP

Posted jackpei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Luogu P1052 过河 DP的主要内容,如果未能解决你的问题,请参考以下文章

P1052 [NOIP2005 提高组] 过河(dp&路径压缩)

luogu P1052 过河

luogu P1052 过河

noip 2005 luogu cogs P1052 过河 WD

P1052 过河 题解

P1052 过河[DP]