[CODEVS1037]取数游戏

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.
原文地址:https://www.cnblogs.com/yangqingli/p/4709268.html