不知道为什么去了 滑铁卢大学官网 下载的 data 在 windows 上运行没有问题。编译加上 -Wall 没有警告。但是超级低分。
楼主可能要回寝室了,看到答案应该是明天晚上。
#include<iostream>
#include<algorithm>
using namespace std;
const int N=3e3+5,M=105;
int n,m,a[N],b[M],cb[M],f[2][M][M][2][2],ans=-1;
//f i j k 01
// i determined j 11 k 00 this 0/1
int F(int u,int v,int w,int o,int p){
if(min({u,v,w,o,p})<0) return -0x7fffffff;
else if(u==1&&(v!=0||w!=0||o!=p)) return -0x7fffffff;
else return f[u&1][v][w][o][p];
}
int fun(int xx,int oo,int xaa,int aax){
int ava=max(0,m-xx),fre=min(ava,oo+2-xaa-aax);
return cb[fre+(ava-fre)/2];
}
int main(){
#ifndef LOCAL
ios::sync_with_stdio(0),
cin.tie(0),cout.tie(0);
#endif
#ifdef LOCAL
freopen(".\\env\\s5\\s5.9.in","r",stdin);
#endif
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
cin>>m;
for(int i=1;i<=m;i++)
cin>>b[i];
sort(b+1,b+n+1),reverse(b+1,b+n+1);
for(int i=1;i<=m;i++)
cb[i]=cb[i-1]+b[i];
f[1][0][0][1][1]=a[1];
f[1][0][0][0][0]=0;
for(int i=2;i<=n;i++){
for(int j=0;j<=m+1;j++){
for(int k=0;k<=m+1;k++){
for(int l:{0,1}){
f[i&1][j][k][1][l]=max(F(i-1,j,k,0,l),F(i-1,j-1,k,1,l))+a[i];
f[i&1][j][k][0][l]=max(F(i-1,j,k-1,0,l),F(i-1,j,k,1,l));
if(j==m+1)
f[i&1][j][k][1][l]=max(f[i&1][j][k][1][l],F(i-1,j,k,1,l))+a[i];
if(k==m+1)
f[i&1][j][k][0][l]=max(f[i&1][j][k][0][l],F(i-1,j,k,0,l));
}
}
}
}
for(int i=0;i<=m;i++)
for(int j=0;j<=m+1;j++)
for(int k1:{0,1})
for(int k2:{0,1}){
//if(f[n][i][j][k1][k2]+fun(i,j,k1,k2)>ans)
//printf("f%d,%d,%d,%d,%d=%d\n",n,i,j,k1,k2,f[n][i][j][k1][k2]);
ans=max(ans,f[n&1][i][j][k1][k2]+fun(i,j,k1,k2));
}
cout<<ans<<endl;
}