• 【BZOJ】1652: [Usaco2006 Feb]Treats for the Cows(dp)


    http://www.lydsy.com/JudgeOnline/problem.php?id=1652

    dp。。

    我们按间隔的时间分状态k,分别为1~n天

    那么每对间隔为k的i和j。而我们假设i或者j在间隔时间内最后取。那么在这个间隔时间内最后取的时间就是n-k+1(这个自己想。。也就是说,之前在n-(k-1)+1的时间间隔内取过了,现在我们要多了一个时刻,相当于取这个早了一个时间)

    然后就是

    k为阶段

    i为左端点

    j=i+k-1为右端点

    t=n-k+1为i-j取最后一个的时间

    然后转移

    f[i][j]=max(f[i+1][j]+t*a[i], f[i][j-1]+t*a[j])

    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    using namespace std;
    #define rep(i, n) for(int i=0; i<(n); ++i)
    #define for1(i,a,n) for(int i=(a);i<=(n);++i)
    #define for2(i,a,n) for(int i=(a);i<(n);++i)
    #define for3(i,a,n) for(int i=(a);i>=(n);--i)
    #define for4(i,a,n) for(int i=(a);i>(n);--i)
    #define CC(i,a) memset(i,a,sizeof(i))
    #define read(a) a=getint()
    #define print(a) printf("%d", a)
    #define dbg(x) cout << #x << " = " << x << endl
    #define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
    inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
    inline const int max(const int &a, const int &b) { return a>b?a:b; }
    inline const int min(const int &a, const int &b) { return a<b?a:b; }
    
    const int N=2005;
    int f[N][N], n, a[N];
    
    int main() {
    	read(n);
    	for1(i, 1, n) read(a[i]);
    	for1(k, 1, n) 
    		for(int i=1; i+k-1<=n; ++i) {
    			int t=n-k+1, j=i+k-1;
    			f[i][j]=max(f[i+1][j]+t*a[i], f[i][j-1]+t*a[j]);
    		}
    	print(f[1][n]);
    	return 0;
    }
    

    Description

    FJ has purchased N (1 <= N <= 2000) yummy treats for the cows who get money for giving vast amounts of milk. FJ sells one treat per day and wants to maximize the money he receives over a given period time. The treats are interesting for many reasons: * The treats are numbered 1..N and stored sequentially in single file in a long box that is open at both ends. On any day, FJ can retrieve one treat from either end of his stash of treats. * Like fine wines and delicious cheeses, the treats improve with age and command greater prices. * The treats are not uniform: some are better and have higher intrinsic value. Treat i has value v(i) (1 <= v(i) <= 1000). * Cows pay more for treats that have aged longer: a cow will pay v(i)*a for a treat of age a. Given the values v(i) of each of the treats lined up in order of the index i in their box, what is the greatest value FJ can receive for them if he orders their sale optimally? The first treat is sold on day 1 and has age a=1. Each subsequent day increases the age by 1.

    约翰经常给产奶量高的奶牛发特殊津贴,于是很快奶牛们拥有了大笔不知该怎么花的钱.为此,约翰购置了N(1≤N≤2000)份美味的零食来卖给奶牛们.每天约翰售出一份零食.当然约翰希望这些零食全部售出后能得到最大的收益.这些零食有以下这些有趣的特性:

    •零食按照1..N编号,它们被排成一列放在一个很长的盒子里.盒子的两端都有开口,约翰每
      天可以从盒子的任一端取出最外面的一个.
    •与美酒与好吃的奶酪相似,这些零食储存得越久就越好吃.当然,这样约翰就可以把它们卖出更高的价钱.
      •每份零食的初始价值不一定相同.约翰进货时,第i份零食的初始价值为Vi(1≤Vi≤1000).
      •第i份零食如果在被买进后的第a天出售,则它的售价是vi×a.
      Vi的是从盒子顶端往下的第i份零食的初始价值.约翰告诉了你所有零食的初始价值,并希望你能帮他计算一下,在这些零食全被卖出后,他最多能得到多少钱.

    Input

    * Line 1: A single integer,

    N * Lines 2..N+1: Line i+1 contains the value of treat v(i)

    Output

    * Line 1: The maximum revenue FJ can achieve by selling the treats

    Sample Input

    5
    1
    3
    1
    5
    2

    Five treats. On the first day FJ can sell either treat #1 (value 1) or
    treat #5 (value 2).

    Sample Output

    43

    OUTPUT DETAILS:

    FJ sells the treats (values 1, 3, 1, 5, 2) in the following order
    of indices: 1, 5, 2, 3, 4, making 1x1 + 2x2 + 3x3 + 4x1 + 5x5 = 43.

    HINT

    Source

  • 相关阅读:
    使用C语言来扩展PHP,写PHP扩展dll
    用C语言写PHP扩展 linux
    mysql 建索引删除索引命令
    xhprof安装&&使用
    Burst Windows 2003 VPS安装中文语言包图文教程
    yii框架的缓存
    rsync的配置与应用
    mysql分组排序取前N条记录的最简洁的单条sql !
    linux下php以fastcgi模式运行
    JS收集<2>:图片上传_限制格式、类型、尺寸
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3962011.html
Copyright © 2020-2023  润新知