题目链接:http://poj.org/problem?id=3186
一:题意:
给定一个序列,序列中有N个元素,我们每次都可以从序列最前面或者最后面取出一个数,
假设按照上面的方法取完所有原序列的数,形成新的序列为a1,a2,,,an,我们为这个
序列定义一个权值:W=a1 * 1 + a2 * 2 + ,,,,,+an*n。题目要求,求出最大的权值。
二,解析:
dp[i][j] 表示区间[ i,j ],能达到的最大权值。
这样可得到递推公式:
dp[x][y]=max(dp[x+1][y]+str[i]*(n-y+x),dp[x+1][y]+str[j]*(n-y+x) );
其中str为原序列,(n-y+x)表示的是取的是第几个数。
三,代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
const int Max=2010;
int N;
int str[Max];
int dp[Max][Max];
int DFS(int first,int last)
{
if(dp[first][last]!=-1)
return dp[first][last];
if(first<=last)
{
int x=DFS(first+1,last)+str[first]*(N-last+first);
int y=DFS(first,last-1)+str[last]*(N-last+first);
if(x>y)
return dp[first][last]=x;
return dp[first][last]=y;
}
return 0;
}
int main()
{
while(scanf("%d",&N)!=EOF)
{
for(int i=0;i<N;i++)
scanf("%d",&str[i]);
memset(dp,-1,sizeof(dp));
cout<<DFS(0,N-1)<<endl;
}
return 0;
}