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

C++-এ স্টোন গেম III (Stone Game III)


আমল এবং বিমল পাথরের গেম খেলছে। পাথরগুলো এক সারি আয়োজিত, প্রতিটির মান stoneValue অ্যারেতে। প্রতিটি টার্নে ১, ২ বা ৩টি পাথর নেওয়া যায়। সর্বোচ্চ স্কোর পাওয়া খেলাড় জিতবে। অপ্টিমাল খেলা ধরে "Amal", "Bimal" বা "Tie" রিটার্ন করুন।

উদাহরণ: [1,2,3,7] -> "Bimal"। আমল ৩টি নিলে ৬ পায়, বিমল ৭ পেয়ে জিতবে।

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

  • DP অ্যারের dp[i] = i-তম পজিশন থেকে খেলাড় যে সর্বোচ্চ নেট স্কোর পারবে।
  • Suffix sum অ্যারে sum[i] = i থেকে শেষ পর্যন্ত যোগফল।
  • i = n-1 থেকে ০: dp[i] = max(sum[i] - dp[k]) for k = i+1 to i+3।
  • total = sum[0], x = dp[0], y = total - x।
  • x>y -> "Amal", x==y -> "Tie", অন্যথায় "Bimal"।

C++ কোড উদাহরণ

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

class Solution {
public:
    string stoneGameIII(vector<int>& v) {
        int n = v.size();
        vector<int> dp(n+10), 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], x = dp[0], y = total - x;
        return x > y ? "Amal" : (x == y ? "Tie" : "Bimal");
    }
};

int main() {
    Solution ob;
    vector<int> v = {1,2,3,7};
    cout << ob.stoneGameIII(v);
    return 0;
}

ইনপুট

{1,2,3,7}

আউটপুট

Bimal
  1. C++-এ Flip Game II: ফ্লিপ গেমে শুরুতেই জয় নিশ্চিত করা সম্ভব কিনা

  2. C++-এ The Maze III সমস্যা সমাধান

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

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