Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 스톤 게임 III

<시간/>

Amal과 Bimal이 돌 더미를 가지고 놀고 있다고 가정합니다. 여러 개의 스톤이 일렬로 배열되어 있으며 각 스톤에는 StoneValue라는 배열에 지정된 숫자인 관련 값이 있습니다.

Amal과 Bimal이 번갈아가며 Amal을 먼저 시작합니다. 각 플레이어의 차례에 해당 행에 남아 있는 첫 번째 돌에서 1, 2 또는 3개의 돌을 가져올 수 있습니다.

각 플레이어의 점수는 가져온 스톤 값의 합계입니다. 처음에 점수는 0입니다. 게임의 목표는 가장 높은 점수로 끝나는 것이며 승자는 가장 높은 점수를 얻은 플레이어이며 동점이 될 수도 있습니다. 게임은 모든 스톤을 차지할 때까지 계속됩니다.

우리는 Amal과 Bimal이 최적의 플레이를 하고 있다고 가정할 것입니다. Amal이 이기면 "Amal", Bimal이 이기면 "Bimal", 같은 점수로 게임을 끝내면 "Tie"를 반환해야 합니다.

따라서 입력이 값 =[1,2,3,7]과 같으면 출력은 Bimal이 되고 As Amal은 항상 잃게 됩니다. 그의 최선의 움직임은 3개의 더미를 가져가서 점수가 6이 되는 것입니다. 이제 Bimal의 점수는 7이고 Bimal이 이깁니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • n + 10 크기의 배열 dp 정의

  • 크기 n + 10의 배열 합계 정의

  • initialize i :=0의 경우, i

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

  • 합계[n - 1] =v[n - 1]

  • initialize i :=n - 2의 경우 i>=0일 때 업데이트(i를 1만큼 감소), −

    • 합계[i] :=합계[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]

  • 총계 :=합계[0]

  • x :=dp[0]

  • y :=총계 - x

  • return x> y가 true이면 "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