有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。你的程序要始终为两位玩家执行最优策略。

 

求出分别从两端取数的最大值,再拿总和减去他即为另一个选手的总分值。用s[I,J]记录序列从I到J的总分值用F[I,J]记录序列从I到J的第二位选手可以取到的最大的分值转移方程即为f[I,J]=MAX{S[I,J]-F[I+1,J],S[I,J]-F[I,J-1]};循环从i为n到1    从j为i到n最大值就是F[1,N]另一个就是S[1,N]-F[1,N]

program game1;
var a,b,i,j,k,n,tot:longint;
s:
array[0..200,0..200]of longint;
f:
array[0..200,0..200]of longint;
num,sum:
array[0..200]of longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end;
begin
assign(input,
'game1.in');reset(input);
assign(output,
'game1.out');rewrite(output);
readln(n);
for i:=1 to n do
begin read(num[i]);sum[i]:=sum[i-1]+num[i];end;
for i:=1 to n do
for j:=i to n do
s[i,j]:
=sum[j]-sum[i-1];
for i:=1 to n do f[i,i]:=num[i];
for i:=n downto 1 do
for j:=i to n do
f[i,j]:
=max(s[i,j]-f[i+1,j],s[i,j]-f[i,j-1]);
b:
=f[1,n];
a:
=s[1,n]-b;
writeln(b,
' ',a);
close(input);close(output);
end.