vijosp1202 Selection

来源:互联网 发布:unity3d粒子系统喷泉 编辑:程序博客网 时间:2024/06/05 00:08

博弈论的思想

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.


0 0