POJ3186:Treats for the Cows(区间DP) - CSDN博客

Treats for the Cows

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)

Total Submission(s) : 5   Accepted Submission(s) : 4

Problem 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 <br> <br>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

题意:将输入的队列从头 和尾取值,将所取的数与乘以第i次的值,求出相加的最大值

思路:

设dp[i][j] 为 取i到j后 的最大值,可能由d[i+1][j]或者d[i][j-1]转移而来。

转移方程:dp[i][j]=max(dp[i+1][j]+p[i]*(n+i-j),dp[i][j-1]+p[j]*(n+i-j));  其中n-(j-i)是第几次取

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;
int a[2001];
int dp[2001][2001];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    memset(dp,0,sizeof(dp));
    for(int i=n;i>=1;i--)
    {
        for(int j=i;j<=n;j++)
        {
            dp[i][j]=max(dp[i+1][j]+a[i]*(n-(j-i)),dp[i][j-1]+a[j]*(n-(j-i)));
        }
    }
    printf("%d",dp[1][n]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunpeishuai/article/details/81232713