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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会敲代码的小帅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值