博弈论的思想
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.