zoukankan      html  css  js  c++  java
  • P3035 [USACO11DEC]Umbrellas for Cows S(DP)

    Solution

    很容易看出本题是用dp解的,所以我们设 (f[i]) 表示前 (i) 个覆盖所需的最小价值。

    易得: (f[i]=min(f[i],f[j-1]+cost[a[i]-a[j]+1]))

    其中 (a[i]) 为第 (i) 个点的位置, (cost[i]) 表示长度为 (i) 的线段的价格

    但是,因为长度越长的线段价格不一定越高并且长度长的可以覆盖短的,所以我们在 $cost[a[i]-a[j]+1] $ ~ (cost[m]) 选一个最小的即可,为了防超时,可预处理一个后缀最小值数组。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    const int N=200005;
    int n,m,f[N],cost[N],a[N],v[N];
    
    inline int read(){
        int x=0,f=1;
        char ch=getchar();
        while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch)){x=x*10+(ch^48);ch=getchar();}
        return x*f;
    }
    
    int main(){
        n=read();m=read();
        memset(f,63,sizeof(f));f[0]=0;
        for(int i=1;i<=n;i++) a[i]=read();
        sort(a+1,a+n+1);
        for(int i=1;i<=m;i++) v[i]=read();
        v[0]=1<<30,cost[m+1]=1<<30;
        for(int i=m;i>=0;i--) cost[i]=min(v[i],cost[i+1]);
        for(int i=1;i<=n;i++)
            for(int j=i;j;j--)
                f[i]=min(f[i],f[j-1]+cost[a[i]-a[j]+1]);
        printf("%d
    ",f[n]);
        return 0;
    }
    
  • 相关阅读:
    九月三十学习报告
    九月二十九学习报告
    九月二十八学习报告
    九月二十七学习报告
    九月二十五学习报告
    九月二十四学习报告
    九月二十三学习报告
    九月二十二学习报告
    九月二十学习报告
    网络协议中HTTP,TCP,UDP,Socket,WebSocket的优缺点/区别
  • 原文地址:https://www.cnblogs.com/jasony/p/13621998.html
Copyright © 2011-2022 走看看