zoukankan      html  css  js  c++  java
  • P2933 [USACO09JAN]气象测量The Baric Bovine

    传送门

    挺显然的 $dp$ ,然鹅一开始想的是 $dfs$

    乱剪剪枝搞了 $70$ 分...

    设 $f[i][j]$ 表示切了 $i$ 次,当前切的位置为 $j$ 的最小误差

    那么转移显然枚举上一个切的位置 $k in [0,j)$ ,有 $f[i][j]=min(f[i][j],f[i-1][k]+g[k][j])$

    其中 $g[k][j]$ 是分的两端为 $k,j$ 时中间产生的误差,这个可以 $n^3$ 预处理好

    然后转移复杂度也是 $n^3$,总复杂度 $O(n^3)$

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    typedef long double ldb;
    inline ll read()
    {
        ll x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int N=207;
    ll n,E,a[N],F[N][N],g[N][N],ans;
    int main()
    {
        n=read(),E=read();
        for(int i=1;i<=n;i++) a[i]=read();
        for(int i=0;i<=n;i++)
            for(int j=i;j<=n+1;j++)
            {
                if(!i) for(int k=1;k<j;k++) g[i][j]+=2*abs(a[k]-a[j]);
                if(j>n) for(int k=i+1;k<=n;k++) g[i][j]+=2*abs(a[k]-a[i]);
                if(i&&j<=n) for(int k=i+1;k<j;k++) g[i][j]+=abs(2*a[k]-a[i]-a[j]);
            }
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++) F[i][j]=E+1;
        F[0][0]=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                for(int k=0;k<j;k++) F[i][j]=min(F[i][j],F[i-1][k]+g[k][j]);
        for(int i=1;i<=n;i++)
        {
            ans=E+1;
            for(int j=1;j<=n;j++) ans=min(ans,F[i][j]+g[j][n+1]);
            if(ans<=E)
            {
                printf("%d %lld
    ",i,ans);
                break;
            }
        }
        return 0;
    }
  • 相关阅读:
    第9天 图片整合
    第六天 元素类型
    第五天 文本溢出
    第四天 盒子模型
    第三天 css核心属性
    第二天 css基础 ,部分选择符
    第一天 HTML基础
    *Move Zeroes
    Word Pattern
    ReentrantLock
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11350386.html
Copyright © 2011-2022 走看看