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

সি++-এ চেরি পিকআপ (Cherry Pickup)

মনে করুন, একটি N x N গ্রিড আছে যা চেরি দিয়ে ভরা। প্রতিটি সেলে নিচের পূর্ণসংখ্যাগুলোর যেকোনো একটি থাকতে পারে:

  • ০ — সেলটি খালি, যাওয়া যায়
  • ১ — সেলে চেরি আছে, সংগ্রহ করে যাওয়া যায়
  • -১ — সেলে কাঁটা আছে, পথ বন্ধ

আমাদের নিচের নিয়ম মেনে সর্বাধিক চেরি সংগ্রহ করতে হবে:

  • (0, 0) থেকে (N-1, N-1) পর্যন্ত ডান বা নিচে যাওয়া
  • (N-1, N-1) থেকে (0, 0) পর্যন্ত বাম বা উপরে ফিরে আসা
  • চেরি যাবেন সেলটি খালি হয়ে যাবে (০ হয়ে যাবে)
  • যদি (0,0) এবং (N-1,N-1) এর মধ্যে কোনো বৈধ পথ না থাকে, তবে চেরি সংগ্রহ করা যাবে না

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

  • দিক নির্দেশক অ্যারে dir := {{1,0}, {0,1}}
  • INF := 10^9
  • 51 x 51 x 51 আকারের dp অ্যারে সংজ্ঞায়িত করুন
  • solve() ফাংশন সংজ্ঞায়িত করুন: r1, c1, c2, grid
    • n := grid.size(), r2 := r1 + c1 - c2
    • বৈধতা চেক: বাউন্ডের বাইরে বা কাঁটা থাকলে -INF রিটার্ন
    • গন্তব্যে পৌঁছালে grid[r1][c1] রিটার্ন
    • যদি dp[r1][c1][c2] != -1 হয়, সেটি রিটার্ন
    • ret := grid[r1][c1] + (r1!=r2 || c1!=c2 ? grid[r2][c2] : 0)
    • temp := -INF
    • k := 0,1 জন্য temp = max(temp, solve(...))
    • dp[r1][c1][c2] = ret + temp রিটার্ন
  • মূল ফাংশন: dp -1 দিয়ে ভরুন, solve(0,0,0,grid) কল করুন, max(0, ret) রিটার্ন

উদাহরণ

#include <bits/stdc++.h> using namespace std; int dir[2][2] = {{1, 0}, {0, 1}}; const int INF = 1e9; class Solution { public:    int dp[51][51][51];    int solve(int r1, int c1, int c2, vector < vector <int> >& grid){       int n = grid.size();       int r2 = r1 + c1 - c2;       int ret = 0;       int m = n? grid[0].size() : 0;       if(r1 < 0 || c1 < 0 || r2 < 0 || c2 < 0 || r1 >= n || r2 >= n || c1 >= m || c2 >= m) return -INF;       if(grid[r1][c1] == -1 || grid[r2][c2] == -1) return -INF;       if(r1 == r2 && c1 == c2 && r1 == n - 1 && c1 == m - 1)return grid[r1][c1];       if(dp[r1][c1][c2] != -1) return dp[r1][c1][c2];       ret += grid[r1][c1];       if(r1 == r2 && c1 == c2){          }else ret += grid[r2][c2];          int temp = -INF;          for(int k = 0; k < 2; k++){          temp = max(temp, solve(r1 + dir[k][0], c1 + dir[k][1], c2 + 1, grid));          temp = max(temp, solve(r1 + dir[k][0], c1 + dir[k][1], c2, grid));       }       return dp[r1][c1][c2] = ret + temp;    }    int cherryPickup(vector<vector<int>>& grid) {       memset(dp, -1, sizeof(dp));       int ret = solve(0, 0, 0, grid);       return max(0, ret);    } }; main(){    Solution ob;    vector<vector<int>> v = {{0,1,-1},{1,0,-1},{1,1,1}};    cout << (ob.cherryPickup(v)); }

ইনপুট

{{0,1,-1},{1,0,-1},{1,1,1}}

আউটপুট

5
  1. C++ Enum: একটি গাইড

  2. C++-এ Switch Statement: ব্যবহার করার পদ্ধতি

  3. Frugal সংখ্যা চেক করা (C++)

  4. C++ দিয়ে পেন্টাটপ (Pentatope) সংখ্যা বের করা