奶牛零食 Treats for the Cows [USACO06FEB]
约翰购置了N(1≤N≤2000)份美味的零食来卖.每天约翰售出一份零食.约翰希望全部售出得到最大的收益.零食有以下特性:
•零食按照1..N编号,被排在盒子里.盒子的两端有开口,每天可以从盒子的任一端取出最外面的一个.
•这些零食储存得越久就越好吃.
•每份零食的初始价值不一定相同.第i份零食的初始价值为Vi(1≤Vi≤1000)
•第i份零食在第a天出售,则它的售价是vi×a.
输入格式:
第一行输入n 有n个奶酪
接下来第n+1行 输入第i个奶酪的价值vi
输出格式:
共一行,FJ可以得到的最大利益
输入输出样例
输入样例#1:
5
1
3
1
5
2
输出样例#1:
43
f[i,j]表示第i到j这个区间可得到的最大利益
动态转移方程:
f[i,j]=max(f[i+1,j]+v[i]×(n-j+1),f[i,j-1]+v[i]×(n-j+1))
#include<bits/stdc++.h>
using namespace std;
int n,v[10001],f[10001][10001];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&v[i]);
for(int i=1;i<=n;i++)f[i][i]=v[i]*n;
for (int j=2;j<=n;j++)//枚举长度
for (int i=1;i<=n;i++)//枚举起始点(左端点)
{
int r=i+j-1;
if (r>n) break;
f[i][r]=max(f[i+1][r]+v[i]*(n-j+1),f[i][r-1]+v[r]*(n-j+1));
}
printf("%d",f[1][n]);
return 0;
}