zoukankan      html  css  js  c++  java
  • 【记忆化搜索】bzoj1652 [Usaco2006 Feb]Treats for the Cows

    跟某NOIP的《矩阵取数游戏》很像。

    f(i,j)表示从左边取i个,从右边取j个的答案。

    f[x][y]=max(dp(x-1,y)+a[x]*(x+y),dp(x,y-1)+a[n-y+1]*(x+y))。

    ans=max{f(i,n-i)}。

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    #define N 2001
    int n,a[N],f[N][N],ans;
    int dp(int x,int y)
    {
        if(f[x][y]!=-1) return f[x][y];
        if((!x)&&(!y)) return f[x][y]=0;
        if(!x) return f[x][y]=dp(x,y-1)+a[n-y+1]*(x+y);
        if(!y) return f[x][y]=dp(x-1,y)+a[x]*(x+y);
        return f[x][y]=max(dp(x-1,y)+a[x]*(x+y),dp(x,y-1)+a[n-y+1]*(x+y));
    }
    int main()
    {
        memset(f,-1,sizeof(f));
        scanf("%d",&n);
        for(int i=1;i<=n;++i)
          scanf("%d",&a[i]);
        for(int i=0;i<=n;++i)
          ans=max(ans,dp(i,n-i));
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    常用css3属性
    jQuery瀑布流
    jQuery事件对象
    jQuery动画
    面向对象复习
    php 面向对象
    git
    存储数据
    ajax
    对象
  • 原文地址:https://www.cnblogs.com/autsky-jadek/p/4596948.html
Copyright © 2011-2022 走看看