传送门biu~
fi,j
表示剩下
i
枚硬币,前一个人拿了
sumi
表示后缀和
转移:
fi,j=max{sumi−fi−k,k} (1≤k≤min(2j,i))
即
fi,j=sumi−min{fi−k,k} (1≤k≤min(2j,i))
fn,1
即为所求答案。
因为在枚举
j
的时候
#include<bits/stdc++.h>
using namespace std;
const int INF=~0u>>1;
int n,k,a[2005],sum[2005],f[2005][2005];
int main(){
scanf("%d",&n);
for(int i=n;i>=1;--i) scanf("%d",&a[i]);
for(int i=1;i<=n;++i) sum[i]=sum[i-1]+a[i];
for(int i=1;i<=n;++i){
int Min=INF;
for(int j=1;j<=n;++j){
k=min(2*j-1,i);
Min=min(Min,f[i-k][k]);
k=min(2*j,i);
Min=min(Min,f[i-k][k]);
f[i][j]=sum[i]-Min;
}
}
printf("%d",f[n][1]);
return 0;
}