P1541 [NOIP2010 提高组] 乌龟棋 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include <iostream>
using namespace std;
int dp[400][400][400];
int cnt[5];
int val[400];
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> val[i];
}
for (int i = 1, a; i <= m; i++) {
cin >> a;
cnt[a] += 1;
}
int ans = 0;
for (int q = 0; q <= cnt[1]; q++) {
for (int i = 0; i <= cnt[2]; i++) {
for (int j = 0; j <= cnt[3]; j++) {
for (int k = 0; k <= cnt[4]; k++) {
if (i) dp[i][j][k] = max(dp[i][j][k], dp[i - 1][j][k]);
if (j) dp[i][j][k] = max(dp[i][j][k], dp[i][j - 1][k]);
if (k) dp[i][j][k] = max(dp[i][j][k], dp[i][j][k - 1]);
dp[i][j][k] += val[q + i * 2 + j * 3 + k * 4];
}
}
}
}
cout << dp[cnt[2]][cnt[3]][cnt[4]];
return 0;
}