题意:
有n个不同价值的东西要卖出,每天只能卖出一个东西,且每次只能卖最后一件或者第一件,东西卖出去的价格=储存天数*本身价值。问怎样卖才能获得最大收益。
思路:
一开始我以为只是简单的先卖两件中的便宜物品,其实这个想法是错的。正确的方法是dp,状态转移方程:dp[i][j]=max(dp[i-1][j]+(i+j)*a[i],dp[i][j-1]+(i+j)*a[n-j+1]);
i代表从前面卖了i个,j代表从后面卖了j个。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[2100][2100],a[2100];
int main(){int n;while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;i++)scanf("%d",&a[i]);memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++)dp[i][0]=dp[i-1][0]+a[i]*i;for(int j=1;j<=n;j++)dp[0][j]=dp[0][j-1]+a[n-j+1]*j;for(int i=1;i<=n;i++)for(int j=1;j+i<=n;j++){//if((i+j)<=n)dp[i][j]=max(dp[i-1][j]+(i+j)*a[i],dp[i][j-1]+(i+j)*a[n-j+1]);} int mx=0;for(int i=1;i<=n;i++)for(int j=1;j+i<=n;j++)if((j+i)==n) mx=max(mx,dp[i][j]);printf("%d\n",mx); }return 0;
}