Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

सी++ में चेरी पिकअप

मान लीजिए हमारे पास एक एन एक्स एन ग्रिड है, यह चेरी से भरा है। प्रत्येक सेल में निम्न में से एक संभावित पूर्णांक होता है -

  • 0 - इंगित करता है कि सेल खाली है, इसलिए हम वहां से गुजर सकते हैं
  • 1 - इंगित करता है कि सेल में एक चेरी है, जिसे हम उठा सकते हैं और वहां से गुजर सकते हैं
  • -1 - इंगित करता है कि कोशिका में एक कांटा है जो रास्ता अवरुद्ध करता है

हमें इन कुछ नियमों का उपयोग करते हुए अधिकतम संख्या में चेरी एकत्र करनी है -

  • स्थिति (0, 0) से प्रारंभ करें और मान्य पथ कक्षों के माध्यम से दाएं या नीचे ले जाकर (N-1, N-1) पर समाप्त करें
  • सेल (N-1, N-1) तक पहुंचने के बाद, वैध पथ सेल के माध्यम से बाएं या ऊपर ले जाकर (0, 0) पर लौटना;
  • जब हम चेरी वाले पथ सेल से गुजर रहे होते हैं, तो हम उसे उठाते हैं और सेल एक खाली सेल बन जाता है (मान 0 होगा);
  • यदि (0, 0) और (N-1, N-1) के बीच कोई मान्य पथ नहीं है, तो कोई चेरी एकत्र नहीं की जा सकती।

तो, अगर इनपुट इस तरह है -

0 1 -1
1 0 -1
1 1 1

आउटपुट 5 होगा, जैसा कि स्थिति (0, 0) से शुरू होता है और नीचे, नीचे, दाएं, पहुंचने का अधिकार (2, 2) तक जाता है। यहां इस एकल यात्रा के दौरान 4 चेरी उठाए गए, और मैट्रिक्स बन गया।

0 1 -1
0 0 -1
0 0 0

फिर, हम एक और चेरी उठाते हुए, बाएं, ऊपर, ऊपर, बाएं से लौटने के लिए (0,0) जाएंगे। उठाए गए चेरी की कुल संख्या 5 होगी।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • आकार की एक सरणी dir परिभाषित करें:2 x 2 :={{1, 0}, {0, 1}}
  • आईएनएफ:=10^9
  • एक सरणी dp आकार परिभाषित करें:51 x 51 x 51।
  • एक फ़ंक्शन को हल करें परिभाषित करें (), इसमें r1, c1, c2, एक 2D सरणी>&ग्रिड,
  • लगेगा
  • n :=ग्रिड का आकार, r2 :=r1 + c1 - c2, ret :=0
  • m :=(यदि n शून्य नहीं है, तो ग्रिड का आकार[0], अन्यथा 0)
  • यदि r1 <0 या c1 <0 या r2 <0 या c2 <0 या r1>=n या r2>=n या c1>=m या c2>=m, तो -
    • वापसी -INF
  • यदि ग्रिड[r1, c1] -1 के समान है या ग्रिड[r2, c2] -1 के समान है, तो −
    • वापसी -INF
  • यदि r1 r2 के समान है और c1 c2 के समान है और r1 n-1 के समान है और c1 m-1 के समान है, तो −
    • रिटर्न ग्रिड[r1, c1]
  • यदि dp[r1, c1, c2] -1 के बराबर नहीं है, तो −
    • रिटर्न डीपी[r1, c1, c2]
  • ret :=ret + grid[r1, c1]
  • यदि r1 r2 के समान है और c1 c2 के समान है, तो:कुछ न करें
  • अन्यथा
    • ret:=ret + grid[r2, c2]
  • अस्थायी:=-INF
  • इनिशियलाइज़ k :=0 के लिए, जब k <2, अपडेट करें (k को 1 से बढ़ाएँ), −
      करें
    • अस्थायी:=अधिकतम अस्थायी और हल(r1 + dir[k, 0], c1 + dir[k, 1], c2 + 1, ग्रिड)
    • अस्थायी:=अधिकतम अस्थायी और हल (r1 + dir[k, 0], c1 + dir[k, 1], c2, ग्रिड)
  • रिटर्न dp[r1, c1, c2] =ret + temp
  • मुख्य विधि से, निम्न कार्य करें -
  • dp को -1 से भरें
  • रिट:=हल करें(0, 0, 0, ग्रिड)
  • अधिकतम 0 लौटाएं और सेवानिवृत्त हों

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#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++

    C++ में स्विच स्टेटमेंट का उपयोग कैसे करें सशर्त बयान सभी प्रोग्रामिंग भाषाओं की एक सामान्य विशेषता है। इन कथनों का उपयोग किसी प्रोग्राम के प्रवाह को नियंत्रित करने और यह निर्दिष्ट करने के लिए किया जाता है कि कोड के विशिष्ट ब्लॉक कब निष्पादित किए जाने चाहिए। C++ में उपयोग किए जाने वाले मुख्य कंडीश

  1. C++ में मितव्ययी संख्या

    इस समस्या में, हमें एक धनात्मक पूर्णांक N दिया जाता है। हमारा कार्य यह जाँचने के लिए एक प्रोग्राम बनाना है कि दी गई संख्या मितव्ययी संख्या है या नहीं। मितव्ययी संख्या - एक संख्या जिसके अंकों की संख्या दी गई संख्या के अभाज्य गुणनखंड में अंकों की संख्या से अधिक है। उदाहरण − 625, संख्या 625 का अभाज्

  1. सी++ पेंटाटोप नंबर

    पास्कल के त्रिभुज में एक पंचकोण संख्या को पाँचवीं संख्या के रूप में वर्णित किया गया है। अब, जैसा कि आप जानते हैं, यह पांचवीं संख्या है, तो इसका मतलब है कि हमारे पास पास्कल के त्रिकोण में कम से कम पांच संख्याएं होनी चाहिए, इसलिए इस श्रृंखला की पहली संख्या 1 4 6 4 1 से शुरू होती है। पास्कल त्रिभुज की