C++石头游戏 III


假设Amal和Bimal正在玩一堆石头游戏。几块石头排成一排,每块石头都有一个关联值,该值是在名为stoneValue的数组中给出的数字。

Amal和Bimal轮流取石头,Amal先开始。在每个玩家的回合中,他/她可以从排在最前面的剩余石头中取走1、2或3块石头。

每个玩家的分数是所取石头的值的总和。最初分数为0。游戏的目标是以最高分结束,得分最高的玩家获胜,也可能出现平局。游戏持续到所有石头都被取走为止。

我们将假设Amal和Bimal都在最佳状态下游戏。如果Amal获胜,我们必须返回“Amal”;如果Bimal获胜,返回“Bimal”;如果他们以相同的分数结束游戏,则返回“Tie”。

因此,如果输入类似于values = [1,2,3,7],则输出将是Bimal,因为Amal总是会输。他最好的举动是拿走三堆石头,分数变为6。现在Bimal的分数是7,Bimal获胜。

为了解决这个问题,我们将遵循以下步骤:

  • 为了解决这个问题,我们将遵循以下步骤:

  • 定义一个大小为n + 10的数组dp

  • 定义一个大小为n + 10的数组sum

  • 对于初始化i := 0,当i < n时,更新(i增加1),执行:

    • dp[i] := -(1^9)

  • sum[n - 1] = v[n - 1]

  • 对于初始化i := n - 2,当i >= 0时,更新(i减少1),执行:

    • sum[i] := sum[i + 1] + v[i]

  • 对于初始化i := n - 1,当i >= 0时,更新(i减少1),执行:

    • 对于初始化k := i + 1,当k <= i + 3 且 k <= n时,更新(k增加1),执行:

      • dp[i] := dp[i] 和 sum[i] - dp[k] 的最大值

  • total := sum[0]

  • x := dp[0]

  • y := total - x

  • 返回如果x > y则为“Amal”;如果x和y相同则为“Tie”;否则为“Bimal”

让我们看看下面的实现,以便更好地理解:

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string stoneGameIII(vector<int>& v) {
      int n = v.size();
      vector <int> dp(n + 10);
      vector <int> sum(n + 10);
      for(int i = 0; i < n; i++)dp[i] = -1e9;
      sum[n - 1] = v[n - 1];
      for(int i = n - 2; i >= 0; i--)sum[i] = sum[i + 1] + v[i];
      for(int i = n- 1 ; i >= 0; i--){
         for(int k = i + 1; k <= i + 3 && k <= n; k++){
            dp[i] = max(dp[i], sum[i] - dp[k]);
         }
      }
      int total = sum[0];
      int x = dp[0];
      int y = total - x;
      return x > y? "Amal" : x == y ? "Tie" : "Bimal";
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,3,7};
   cout << (ob.stoneGameIII(v));
}

输入

{1,2,3,7}

输出

Bimal

更新于:2020年6月9日

浏览量:165

开启您的职业生涯

完成课程获得认证

开始学习
广告