• poj3186 Treats for the Cows


    http://poj.org/problem?id=3186

    Treats for the Cows
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 4041   Accepted: 2063

    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.
    题意:
       给一个序列,只能从俩端出,出一个乘以天数。
    分析:
    本来想,一个序列,只能从俩端出,就只要比较俩端的大小就可以了,其实不然,看下面的测试数据:
    4
    101 1 102 100
    按照我想的结果是713;
    可是如果你首先找出102为第5天,接下来就是递推的过程了。
    所以明显大很多811.
    所以状态转移方程是 dp[i][j]=max(dp[i+1][j]+v[i]*(n-j+i),dp[i][j-1]+v[j]*(n-j+i));
    n-j+i是天数,通过一个一个找出的规律。
     
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    int dp[2005][2005];
    int main()
    {
       int n,i,g,k,v[2005],j;
       while(~scanf("%d",&n))
       {
           memset(dp,0,sizeof(dp));
           for(i=0;i<n;i++)
             {
                 scanf("%d",&v[i]);
                   dp[i][i]=v[i]*n;//初始化,从最后出对往前推,假设每个都是最后出对。
             }
            for(k=1;k<=n;k++)
           {
               for(i=0;i<n-k;i++)
                 {
                     j=i+k;
                     dp[i][j]=max(dp[i+1][j]+v[i]*(n-j+i),dp[i][j-1]+v[j]*(n-j+i));
                     //这里是从最后出队的开始往前推,因为只有最后出队的,
                     //i+1才会等于j。  
                }
           }
            printf("%d
    ",dp[0][n-1]);
       }
       return 0;
    }
    /*#include<iostream>
    #include<cstdio>
    using namespace std;
    int main()
    {
        int i,t,a[2005],j,ans,n;
        while(~scanf("%d",&t))
        {
            ans=0;n=1;
          for(i=0;i<t;i++)
            scanf("%d",&a[i]);
            i=0;j=t-1;n=1;
            while(n<=t)
            {
    
              if(a[i]<a[j])
               {
                    ans+=a[i]*n;
                    printf("ans=%d
    ",ans);
                      i++;
               }
              else
                 {
                     ans+=a[j]*n;
                      printf("ans=%d
    ",ans);
                     j--;
                 }
               n++;
            }
            printf("%d
    ",ans);
        }
        return 0;
    }*/
  • 相关阅读:
    HPUX巡检
    关于一些pdf撞的南墙(.net)
    Spire pdf 操作pdf,页眉 页脚 水印 二维码
    生成的excel转成Pdf(接上篇)
    NPOI操作excel--以及组件转换成Pdf
    以下代码输出啥?为什么会这样输出?
    转:data-toggle与data-target的作用
    告别外包,重新出发
    AutoFac依赖注入框架--个人测试demo-新手
    C# json转xml
  • 原文地址:https://www.cnblogs.com/cancangood/p/3864945.html
Copyright © 2020-2023  润新知