Rt
我用的是从后往前推+记忆化
但是0分……
#include<bits/stdc++.h>
using namespace std;
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int memre[51][51][51][51]={0};
bool vis[51][51][51][51]={0};
int score[500]={0};
int card[5];
int n,m;
int dp(int w,int x,int y,int z){
if(w==0&&x==0&&y==0&&z==0){
return score[1];
}
if(vis[w][x][y][z]){
return memre[w][x][y][z];
}
int now=w+x*2+y*3+z*4;
if(w){
memre[w][x][y][z]=max(memre[w][x][y][z],dp(w-1,x,y,z));
}
if(x){
memre[w][x][y][z]=max(memre[w][x][y][z],dp(w,x-1,y,z));
}
if(y){
memre[w][x][y][z]=max(memre[w][x][y][z],dp(w,x,y-1,z));
}
if(z){
memre[w][x][y][z]=max(memre[w][x][y][z],dp(w,x,y,z-1));
}
memre[w][x][y][z]+=score[now+1];
vis[w][x][y][z]=true;
return memre[w][x][y][z];
}
int main(){
IO;
cin>>n>>m;
for(register int i=1;i<=n;++i){
cin>>score[i];
}
while(--m){
int i;
cin>>i;
card[i]++;
}
cout<<dp(card[1],card[2],card[3],card[4]);
return 0;
}