样例能过,但神秘爆0
#include <bits/stdc++.h>
using namespace std;
int n,m,dp[404][50][50][50],cnt[5],x,a[404];
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=m;++i){
cin>>x;
cnt[x]++;
}
dp[1][0][0][0]=a[1];
for(int i=2;i<=n;++i){
if(cnt[1]){
for(int cd1=1;cd1<=cnt[1];++cd1){
for(int cd2=0;cd2<=cnt[2];++cd2){
for(int cd3=0;cd3<=cnt[3];++cd3){
int cd4=i-cd1-cd2*2-cd3*3-1;
if(cd4<0||cd4>cnt[4]) continue;
dp[i][cd1][cd2][cd3]=max(dp[i-1][cd1-1][cd2][cd3]+a[i],dp[i][cd1][cd2][cd3]);
}
}
}
}
if(i>2&&cnt[2]){
for(int cd1=0;cd1<=cnt[1];++cd1){
for(int cd2=1;cd2<=cnt[2];++cd2){
for(int cd3=0;cd3<=cnt[3];++cd3){
int cd4=i-cd1-cd2*2-cd3*3-1;
if(cd4<0||cd4>cnt[4]) continue;
dp[i][cd1][cd2][cd3]=max(dp[i-2][cd1][cd2-1][cd3]+a[i],dp[i][cd1][cd2][cd3]);
}
}
}
}
if(i>3&&cnt[3]){
for(int cd1=0;cd1<=cnt[1];++cd1){
for(int cd2=0;cd2<=cnt[2];++cd2){
for(int cd3=1;cd3<=cnt[3];++cd3){
int cd4=i-cd1-cd2*2-cd3*3-1;
if(cd4<0||cd4>cnt[4]) continue;
dp[i][cd1][cd2][cd3]=max(dp[i-3][cd1][cd2][cd3-1]+a[i],dp[i][cd1][cd2][cd3]);
}
}
}
}
if(i>4&&cnt[4]){
for(int cd1=0;cd1<=cnt[1];++cd1){
for(int cd2=0;cd2<=cnt[2];++cd2){
for(int cd3=0;cd3<=cnt[3];++cd3){
int cd4=i-cd1-cd2*2-cd3*3-1;
if(cd4<=0||cd4>cnt[4]) continue;
dp[i][cd1][cd2][cd3]=max(dp[i-4][cd1][cd2][cd3]+a[i],dp[i][cd1][cd2][cd3]);
}
}
}
}
}
cout<<dp[n][cnt[1]][cnt[2]][cnt[3]];
return 0;
}