POJ-3186-Treats for the Cows

45 阅读1分钟

题意:

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


\