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; } };