乌龟棋312
yz视频yyds!
状态表示:f(a,b,c,d) 为a张1,b张2,c张3,d张4的方案
状态转移:分析最后一张卡片是什么从而往前推
/*最后一种卡片用a或者bcd有四种方法,分成四类,求出每一类最大值再求max */
#include<bits/stdc++.h>
using namespace std;
const int N=45,M=355;
int n,m;
int w[M],b[4],f[N][N][N][N];
int main(){
cin>>n>>m;
for(int i=0;i<n;i++)cin>>w[i];
while(m--){
int x;
cin>>x;
b[x-1]++;
}
for(int A=0;A<=b[0];A++){
for(int B=0;B<=b[1];B++){
for(int C=0;C<=b[2];C++){
for(int D=0;D<=b[3];D++){
int sc=w[A+B*2+C*3+D*4]; //0也要算
int &v=f[A][B][C][D];
v=sc;//最基础的初始值
if(A) v=max(v,f[A-1][B][C][D]+sc);
if(B) v=max(v,f[A][B-1][C][D]+sc);
if(C) v=max(v,f[A][B][C-1][D]+sc);
if(D) v=max(v,f[A][B][C][D-1]+sc);
//再算出能不能由前面的状态转移过来
}
}
}
}
cout<<f[b[0]][b[1]][b[2]][b[3]]<<endl;
return 0;
}