POJ-3186

其实这个题我也不能算原创几天前看过题解这次没看题解而已
首先,dp[i][j]表示的是i到j的最优解,而且我们可以反着看,就是说随机取一个数乘n,再在他旁边两个数里面选一个乘以n-1,以此类推,因此dp[i][i]=n*a[i],具体可以看代码理解
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[2001];
int dp[2001][2001];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=n;i>=1;i--)
	{
		dp[i][i]=n*a[i];
		for(int j=i+1;j<=n;j++)
		{
			dp[i][j]=max(dp[i+1][j]+a[i]*(n+i-j),dp[i][j-1]+a[j]*(n+i-j));                        //i,j之间包含j-i+1个元素  ,n+i-j 
		}	
	}
	cout<<dp[1][n]<<endl;
 } 
这个乘n+i-j可以自己举个例子试一下,不是n+i-j-1


猜你喜欢

转载自blog.csdn.net/Asensio_20/article/details/79734361