N(2 <=N<=200,且为偶数)个正整数的序列放在一个游戏平台上,A、B两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜(A先取,得分相同算A胜)。试求:
如何取数,才能使得A与B的得分差距最大?
(提示:A、B双方都在想方设法取胜)
{
不是贪心不是模拟
想获胜不是从两端取最大的
f[i,j]表示在区间i,j先取数的人所能得到的最大得分
初始值f[i,i]:=ai;
从取第I个和区第J个中比较最大的
差值最大——一个人得分最高!
}
var a:array[0..100] of longint; f:array[0..100,0..100] of longint; sum:array[0..100] of longint; i,n,j,p:longint; function min (x,y:longint):longint; begin if x<y then exit(x) else exit(y); end; begin read(n); for i:=1 to n do read(a[i]); for i:=1 to n do f[i,i]:=a[i]; for i:=1 to n do for j:=1 to i do sum[i]:=sum[i]+a[j]; for i:=1 to n-1 do for j:=1 to n-i do begin p:=i+j; f[j,p]:=sum[p]-sum[j-1]-min(f[j+1,p],f[j,p-1]); end; writeln(f[1,n],' ',sum[n]-f[1,n])
end.