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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值