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

  • 相关阅读:
    第四次实践作业
    第三次实践作业
    第二次实践作业
    第一次实践作业
    第02组 Beta版本演示
    第02组 Beta冲刺(4/4)
    大数据应用技术课程实践--选题与实践方案
    15 手写数字识别-小数据集
    14 深度学习-卷积
    13 垃圾邮件分类2
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10783092.html
Copyright © 2011-2022 走看看