vijosp1202 Selection

博弈论的思想

sum[i]表示1~i的和,f[i,j]表示当前 这个人取i~j的最大值。

f[i,j]=max(a[i]+sum[j]-sum[i]-f[i+1,j],a[j]+sum[j-1]-sum[i-1]-f[i,j-1])

因为每个人都取自己当前的最优值,所以需要这样变换

若k=0,那么答案是相反的,否则是f[1,n]

program t;
var n,k,i,j,l:longint;
    f:array[0..2000,0..2000]of longint;
	sum,a:array[0..2000]of longint;
function max(a,b:longint):longint;
begin
 if a>b then max:=a else max:=b;
end;
begin
 while not eof do 
  begin  
 read(n);
 read(k);
 fillchar(f,sizeof(f),0);
 for i:=1 to n do 
  begin 
   read(a[i]);
   sum[i]:=sum[i-1]+a[i];
   f[i,i]:=a[i];
  end;
 for l:=1 to n do 
  for i:=1 to n do
   begin
    j:=i+l;
	if j<=n then 
	 f[i,j]:=max(a[i]+sum[j]-sum[i]-f[i+1,j],a[j]+sum[j-1]-sum[i-1]-f[i,j-1]); //每个人都会选自己最优的,如果当前选a[i],则sum[i+1,j]-f[i+1,j]表示i+1~j中这个人选的
   end;
 if k=0 then writeln(sum[n]-f[1,n]) else writeln(f[1,n]);
 end;
end.


你可能感兴趣的:(vijosp1202 Selection)