感受
思路
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 350 + 10;
int dp[maxn][45][45][45];
///dp[pos][x][y][z] 剩余x张1, y张2, z张3
int n, m;
int a[maxn];
int num[5];
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
int v;
for(int i = 1; i <= m; i++){
scanf("%d", &v); num[v]++;
}
memset(dp, -1, sizeof(dp));
dp[1][num[1]][num[2]][num[3]] = a[1];
for(int i = 2; i <= n; i++){
for(int x = num[1]; x >= 0; x--){
for(int y = num[2]; y >= 0; y--){
for(int z = num[3]; z >= 0; z--){
int q = (i - 1) - (num[1] - x) - 2 * (num[2] - y) - 3 * (num[3] - z);
if(q % 4) continue;
q /= 4; if(q > num[4]) continue;
if(x != num[1] && dp[i - 1][x + 1][y][z] >= 0) dp[i][x][y][z] = max(dp[i][x][y][z], dp[i - 1][x + 1][y][z] + a[i]);
if(y != num[2] && i > 2 && dp[i - 2][x][y + 1][z] >= 0) dp[i][x][y][z] = max(dp[i][x][y][z], dp[i - 2][x][y + 1][z] + a[i]);
if(z != num[3] && i > 3 && dp[i - 3][x][y][z + 1] >= 0) dp[i][x][y][z] = max(dp[i][x][y][z], dp[i - 3][x][y][z + 1] + a[i]);
if(i > 4 && dp[i - 4][x][y][z] >= 0) dp[i][x][y][z] = max(dp[i][x][y][z], dp[i - 4][x][y][z] + a[i]);
}
}
}
}
printf("%d\n", dp[n][0][0][0]);
return 0;
}



京公网安备 11010502036488号