কম্পিউটার টিউটোরিয়াল

C++-এ স্টোন গেম II


অ্যালিস এবং বব পাইল গেম খেলছে। পাইলস অ্যারে piles[i]। 앨িস প্রথমে খেলে। M=1 থেকে শুরু। প্রতিটি টার্নে игрোক ১ থেকে ২M পাইল নিতে পারে। M = max(M, X)। গেম শেষে 앨িসের সর্বোচ্চ স্টোন বের করতে হবে।

উদাহরণ: piles=[2,7,9,4,4] → ১০ (অ্যালিস নেয় ১, বব নেয় ২, 앨িস নেয় ২)।

সমাধানের ধাপসমূহ

  • সাফিক্স সম অ্যারে arr[i] = i থেকে শেষ পর্যন্ত যোগফল।
  • DP: solve(i, M) = i-তম ইনডেক্স থেকে M দিয়ে 앨িসের সর্বোচ্চ স্টোন।
  • বেস: i >= n → ০; i-1+2M >= n → arr[i]।
  • ট্রানজিশন: X=1..2M, 앨িস নেয় X, ববের সর্বনিম্ন অর্জন = min(solve(i+X, max(X,M))), 앨িস পায় arr[i] - opponentMin।
  • মেমোরাইজেশন দিয়ে DP টেবিল বানান।

C++ উদাহরণ

#include <bits/stdc++.h>
using namespace std;

class Solution {
    int solve(vector<int>& arr, int i, int m, vector<vector<int>>& dp) {
        if (i >= arr.size()) return 0;
        if (dp[i][m] != -1) return dp[i][m];
        if (i - 1 + 2 * m >= arr.size()) return arr[i];
        int oppMin = INT_MAX;
        for (int x = 1; x <= 2 * m; x++)
            oppMin = min(oppMin, solve(arr, i + x, max(x, m), dp));
        return dp[i][m] = arr[i] - oppMin;
    }
public:
    int stoneGameII(vector<int>& piles) {
        int n = piles.size();
        vector<int> arr(n);
        arr[n-1] = piles[n-1];
        for (int i = n-2; i >= 0; i--) arr[i] = arr[i+1] + piles[i];
        vector<vector<int>> dp(n+1, vector<int>(n+1, -1));
        return solve(arr, 0, 1, dp);
    }
};

int main() {
    vector<int> v = {2,7,9,4,4};
    Solution ob;
    cout << ob.stoneGameII(v);
}

ইনপুট

[2,7,9,4,4]

আউটপুট

10
  1. C++-এ Line Reflection: ২D প্লেনে বিন্দুগুলোর Y-অক্ষ সমান্তরাল প্রতিফলন লাইন আছে কিনা যাচাই করা

  2. C++-এ জাম্প গেম IV (Jump Game IV)

  3. 4Sum সমস্যা C++-এ

  4. C++-এ static_cast