zoukankan      html  css  js  c++  java
  • Luogu P1052 过河 DP

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


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

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

    路径压缩引用一下证明From Luogu@Panda_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
    ",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
    ",ans);
    }

    2019.04.28 慌得一批QAQ

  • 相关阅读:
    noip2016十连测round1
    [bzoj 3732] Network (Kruskal重构树)
    主席树学习笔记
    [ZKW线段树]
    [poj2182] Lost Cows (线段树)
    [模板] 线性筛逆元
    [模板] 线筛欧拉函数
    [模板] SAP
    [poj2411] Mondriaan's Dream (状压DP)
    [poj2247] Humble Numbers (DP水题)
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10783092.html
Copyright © 2011-2022 走看看