1 条题解

  • 2
    @ 2024-6-13 3:18:40

    【解题思路】:考虑使用 dp 算法,设 dp[i][j][k]表示前 i 轮中,第 i 轮出的牌为j(0<=j<=2),已经换过 k 次牌的最大得分,则 image

    这里的a数组是奖励的得分,b数组是换牌的惩罚,c数组是小杨的出牌,result(x,y)表示出牌为 x 时和 y 的胜负情况(胜利返回 2,平局返回 1,失败返回 0)上面一行表示当前轮出牌和上一轮相同,下面一行表示不同,需要额外付出 b[k]的代价。 最终答案为: image

    【参考程序】:

    #include <bits/stdc++.h>
    using namespace std;
    int n, a[1005], b[1005], c[1005], dp[3][1005];
    int result(int x, int y)
    {
        if (x == y + 1 || x == y - 2)
            return 2;
        if (x == y)
            return 1;
        return 0;
    }
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; ++i)
            cin >> a[i];
        for (int i = 1; i < n; ++i)
            cin >> b[i];
        for (int i = 1; i <= n; ++i)
            cin >> c[i];
        memset(dp, 128, sizeof(dp));
        for (int k = 0; k < 3; ++k)
        {
            dp[k][0] = result(k, c[1]) * a[1];
        }
        for (int i = 2; i <= n; ++i)
            for (int j = i - 1; j >= 0; --j)
                for (int k = 0; k < 3; ++k)
                {
                    int curr_score = result(k, c[i]) * a[i];
                    dp[k][j] = dp[k][j] + curr_score;
                    if (j > 0)
                    {
                        for (int l = 0; l < 3; ++l)
                        {
                            dp[k][j] = max(dp[k][j], dp[l][j - 1] + curr_score - b[j]);
                        }
                    }
                }
        int ans = -2e9, x = 0;
        for (int j = 0; j < n; ++j)
            for (int k = 0; k < 3; ++k)
            {
                ans = max(ans, dp[k][j]);
            }
        cout << ans << endl;
        return 0;
    }
    
    • 1

    [GESP202312 七级] 纸牌游戏

    信息

    ID
    582
    时间
    1000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    14
    已通过
    8
    上传者