• poj 3186 Treats for the Cows(dp)


    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.

    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

    Sample Output

    43

    Hint

    Explanation of the sample: 

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

    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.
     
    题意:给你一组序列 只能从左端点 或者 右端点 选取一个数乘上选取它的天数 得到一个最大 权值和
    思路: dp[i][j] 表示第i个物品 选取j个左边的物品 的最大权值
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<string>
    #include<vector>
    #include<stack>
    #include<bitset>
    #include<cstdlib>
    #include<cmath>
    #include<set>
    #include<list>
    #include<deque>
    #include<map>
    #include<queue>
    #define ll long long int
    using namespace std;
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
    int moth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int dir[4][2]={1,0 ,0,1 ,-1,0 ,0,-1};
    int dirs[8][2]={1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};
    const int inf=0x3f3f3f3f;
    const ll mod=1e9+7;
    int a[2007];
    int dp[2007][2007];
    int main(){
        ios::sync_with_stdio(false);
        int n;
        while(cin>>n){
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++){
                cin>>a[i];
            //    sum[i]+=a[i];
            }
            dp[1][0]=a[n];
            dp[1][1]=a[1];
            for(int i=2;i<=n;i++){
                for(int j=n;j>=n-i+1;j--)
                dp[i][0]+=(a[j]*(n-j+1));
                for(int j=1;j<=i;j++){
                    if(dp[i-1][j-1]+a[j]*i<dp[i-1][j]+a[n-(i-1-j)]*i){
                        dp[i][j]=dp[i-1][j]+a[n-(i-1-j)]*i;
                    }else{
                        dp[i][j]=dp[i-1][j-1]+a[j]*i;
                    }
                }
            }
            int ans=-inf;
            for(int i=0;i<=n;i++)
                ans=max(dp[n][i],ans);
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    第1章 数据类型 第1节 JavaScript中的几个重要概念
    第1章 数据类型 第3节 JavaScript数值类型(2)
    第1章 数据类型 第4节 JavaScript字符类型
    GDI编程框架代码
    linux清空日志文件内容 比如log日志
    快速点对点批量向员工推送企业微信消息的方法
    在EasySQLMAIL中实现表格的行列转置
    快速信息分发技巧:按员工手机号通过企业微信点对点分发信息
    网络
    【odoo】【相识篇】一、Odoo VS SAP?
  • 原文地址:https://www.cnblogs.com/wmj6/p/10642669.html
Copyright © 2020-2023  润新知