অ্যালিস এবং বব পাইল গেম খেলছে। পাইলস অ্যারে 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