tyvj1088

DP啊!!

状态f[i,j]表示,当前正在捡起第i个,从前面拿了j个(因为从后面拿了多少可以通过这个算出来)

每个状态有两种转移方式,即F[i,j]可能是第i次拿了第j个,或者是拿了第(n-(i-j)+1)个

方程即为 f[i,j]:=max(f[i-1,j]+a[n-(i-j)+1]*i,f[i-1,j-1]+a[j]*i);

skysun原创转载请注明出处,http://www.cnblogs.com/skysun

View Code
 1 program sky;
2 var
3 i,j,n : longint;
4 a : array[0..2001] of longint;
5 f : array[0..2001,0..2001] of longint;
6 function max(qq,ww: longint ):longint;
7 begin
8 if qq>ww then exit(qq); exit(ww);
9 end;
10 begin
11 read(n);
12 for i:=1 to n do read(a[i]);
13 for i:=1 to n do
14 for j:=0 to i do
15 f[i,j]:=max(f[i-1,j]+a[n-(i-j)+1]*i,f[i-1,j-1]+a[j]*i);
16 for i:=1 to n do f[n,n]:=max(f[n,n],f[n,i]);
17 writeln(f[n,n]);
18 end.

代码如上,最终从所有状态里取一个最优的,即最后拿的是哪一个不确定

posted @ 2012-03-31 08:26  SunSky...  阅读(187)  评论(0编辑  收藏  举报