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

C++-এ ৩n স্লাইস পিজা (Pizza With 3n Slices)


৩n স্লাইসের পিজা আছে। আমি এবং দুই বন্ধু পালাবদলে নিব: আমি যেকোনো একটা, আমল এন্টি-ক্লকওয়াইজ, বিমল ক্লকওয়াইজ। সর্বোচ্চ কত আকারের স্লাইস আমি পেতে পারি তা বের করুন।

উদাহরণ: [9,8,6,1,1,8] -> ১৬ (প্রতিবার ৮ আকারের স্লাইস নিলে)।

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

  • সার্কুলার অ্যারে -> লিনিয়ার করতে দুটি কেস: প্রথম স্লাইস নেই, বা প্রথম স্লাইস নেওয়া।
  • solve(v, m): DP দিয়ে m টি স্লাইস নেওয়ার সর্বোচ্চ যোগফল। dp1[i][j] = i-তম পর্যন্ত j টি নেওয়া নেই, dp2[i][j] = i-তম নেওয়া।
  • ট্রানজিশন: dp2[i+1][j+1] = max(dp2[i+1][j+1], dp1[i][j]+v[i])। dp1[i+1][j] = max(dp1[i+1][j], dp1[i][j], dp2[i][j])।
  • উত্তর = max(solve(slices[1:], n/3), slices[0] + solve(slices[2:-1], n/3-1))।

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

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

class Solution {
public:
    int solve(vector<int> v, int m) {
        int n = v.size();
        vector<vector<int>> dp1(n+1, vector<int>(m+1));
        vector<vector<int>> dp2(n+1, vector<int>(m+1));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j <= m; j++) {
                int x = v[i];
                if (j < m) dp2[i+1][j+1] = max(dp2[i+1][j+1], dp1[i][j] + x);
                dp1[i+1][j] = max({dp1[i+1][j], dp2[i][j], dp1[i][j]});
            }
        }
        return max(dp1[n][m], dp2[n][m]);
    }
    int maxSizeSlices(vector<int>& slices) {
        int n = slices.size();
        int ret = max(solve(vector<int>(slices.begin()+1, slices.end()), n/3),
                      slices[0] + solve(vector<int>(slices.begin()+2, slices.end()-1), n/3 - 1));
        return ret;
    }
};

int main() {
    Solution ob;
    vector<int> v = {9,8,6,1,1,8};
    cout << ob.maxSizeSlices(v);
    return 0;
}

ইনপুট

{9,8,6,1,1,8}

আউটপুট

16
  1. C++-এ এক্সপ্রেশন ট্রি (Expression Tree) উদাহরণসহ

  2. C++-এ কি-সহ পারমিউটেশন কুয়েরি প্রসেস করুন

  3. সামান সামের সাবঅ্যারে দিয়ে অ্যারে স্প্লিট করা C++-এ

  4. C++-এ সর্বোচ্চ পানি ধারণকারী কন্টেইনার (Container With Most Water)