列表

详情


OR20. 纸牌博弈

描述

有一个整型数组A,代表数值不同的纸牌排成一条线。玩家a和玩家b依次拿走每张纸牌,规定玩家a先拿,玩家B后拿,但是每个玩家每次只能拿走最左或最右的纸牌,玩家a和玩家b都绝顶聪明,他们总会采用最优策略。请返回最后获胜者的分数。

给定纸牌序列A及序列的大小n,请返回最后分数较高者得分数(相同则返回任意一个分数)。保证A中的元素均小于等于1000。且A的大小小于等于300。

测试样例:
[1,2,100,4],4
返回:101

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 504KB, 提交时间: 2020-10-31

class Cards {
public:
    int cardGame(vector<int> A, int n) {
        vector<vector<int>> a(n, vector<int>(n, 0)), b=a;
        for(int j=0; j<n; j++){
            a[j][j] = A[j];
            b[j][j] = 0;
            for(int i=j-1; i>=0; i--){
                a[i][j] = max(A[i]+b[i+1][j], A[j]+b[i][j-1]);
                b[i][j] = min(a[i+1][j], a[i][j-1]);
            }
        }
        return max(a[0][n-1], b[0][n-1]);
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 504KB, 提交时间: 2020-09-15

class Cards {
public:
    int cardGame(vector<int> A, int n) {
        int i,j,res;
        vector<vector<int>> first(n,vector<int>(n,0)),second(n,vector<int>(n,0));
        for(i=0;i<n;i++)
        {
            first[i][i]=A[i];
            second[i][i]=0;
            for(j=i-1;j>=0;j--)
            {
                first[j][i]=((A[j]+second[j+1][i])>=(A[i]+second[j][i-1]))?(A[j]+second[j+1][i]):(A[i]+second[j][i-1]);
                second[j][i]=(first[j+1][i]<=first[j][i-1])?first[j+1][i]:first[j][i-1];
            }
        }
        res=(first[0][n-1]>=second[0][n-1])?first[0][n-1]:second[0][n-1];
        return res;
    }
};

上一题