计蒜客 T2098 乌龟棋
题目链接:计蒜客 T2098 乌龟棋
题目大意:
题解:
设\(dp[a][b][c][d]\)表示走一步、两步、三步、四步的卡分别用了\(a\)、\(b\)、\(c\)、\(d\)张。
状态转移方程:
\[dp[a][b][c][d]=max\{dp[a - 1][b][c][d],dp[a][b - 1][c][d],dp[a][b][c - 1][d],dp[a][b][c][d - 1]\}+score[a + 2 * b + 3 * c + 4 * d + 1]
\]
答案为\(dp[cnt[1]][cnt[2]][cnt[3]][cnt[4]]\)。
#include <cstring>
#include <iostream>
using namespace std;
int dp[40][40][40][40], score[355], n, m, cnt[5];
int max_4(int a, int b, int c, int d) { return max(a, max(b, max(c, d))); }
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> score[i];
}
for (int i = 1, x; i <= m; ++i) {
cin >> x;
cnt[x]++;
}
for (int a = 0; a <= cnt[1]; ++a) {
for (int b = 0; b <= cnt[2]; ++b) {
for (int c = 0; c <= cnt[3]; ++c) {
for (int d = 0; d <= cnt[4]; ++d) {
dp[a][b][c][d] = max_4(a > 0 ? dp[a - 1][b][c][d] : 0,
b > 0 ? dp[a][b - 1][c][d] : 0,
c > 0 ? dp[a][b][c - 1][d] : 0,
d > 0 ? dp[a][b][c][d - 1] : 0) + score[a + 2 * b + 3 * c + 4 * d + 1];
}
}
}
}
cout << dp[cnt[1]][cnt[2]][cnt[3]][cnt[4]];
return 0;
}