和之前的着色方案差不多
用dp[a][b][c][d] ,a表示1的卡片,b表示2的卡片,c表示3的卡片,d表示4的卡片
然后直接搜索就行了
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <stack>
#include <queue>
#include <cmath>
#define ll long long
#define pi 3.1415927
#define inf 0x3f3f3f3f
#define mod 1000000007
using namespace std;
#define _int __int128_t
int n,m,dp[45][45][45][45],aa[1005],bb[6];
int dfs(int a, int b, int c, int d)
{
if(a+b+c+d==0)
return aa[n];
if(dp[a][b][c][d])
return dp[a][b][c][d];
int l=bb[1]-a+2*(bb[2]-b)+3*(bb[3]-c)+4*(bb[4]-d)+1;
int ans=0;
if(a) ans =max(ans,aa[l]+dfs(a-1,b,c,d));
if(b) ans =max(ans,aa[l]+dfs(a,b-1,c,d));
if(c) ans =max(ans,aa[l]+dfs(a,b,c-1,d));
if(d) ans =max(ans,aa[l]+dfs(a,b,c,d-1));
return dp[a][b][c][d]= ans;
}
int main ()
{
int T,i,t,j,k,p,sum=0;
cin>>n>>m;
for(i=1;i<=n;++i)
cin>>aa[i];
for(i=1;i<=m;++i){
cin>>p;
bb[p]++;
}
sum=dfs(bb[1],bb[2],bb[3],bb[4]);
cout<<sum<<endl;
return 0;
}
京公网安备 11010502036488号