线性dp
枚举用了A,B,C,D张牌能走的最远距离。
#include<iostream>
#include<algorithm>
using namespace std;
const int N=360,M=41;
int a[N],b[6],dp[M][M][M][M];
int main(void)
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=1;i<=m;i++)
{
int t;
cin>>t;
b[t]++;
}
for(int A=0;A<=b[1];A++)
for(int B=0;B<=b[2];B++)
for(int C=0;C<=b[3];C++)
for(int D=0;D<=b[4];D++)
{
int g=a[A+B*2+C*3+D*4];
int &v=dp[A][B][C][D];
v=g;
if(A) v=max(v,dp[A-1][B][C][D]+g);
if(B) v=max(v,dp[A][B-1][C][D]+g);
if(C) v=max(v,dp[A][B][C-1][D]+g);
if(D) v=max(v,dp[A][B][C][D-1]+g);
}
cout<<dp[b[1]][b[2]][b[3]][b[4]];
}