计蒜客 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;
}
posted @ 2021-07-26 02:40  ZZHHOOUU  阅读(28)  评论(0编辑  收藏  举报