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

सी++ में न्यूनतम गिरने वाला पथ योग II

मान लीजिए कि हमारे पास ग्रिड एरर है, यह एक स्क्वायर ग्रिड है, गैर-शून्य शिफ्ट के साथ गिरने वाला पथ गिरफ्तारी की प्रत्येक पंक्ति से बिल्कुल एक तत्व का विकल्प है, जैसे कि आसन्न पंक्तियों में चुने गए दो तत्व एक ही कॉलम में मौजूद नहीं होते हैं। हमें शून्येतर पारियों के साथ गिरने वाले पथ का न्यूनतम योग ज्ञात करना होगा।

इसलिए, यदि इनपुट गिरफ्तारी की तरह है [[1,2,3], [4,5,6], [7,8,9]], तो आउटपुट 13 होगा, क्योंकि अलग-अलग गिरने वाले रास्ते हैं, ये [1,5,9], [1,5,7], [1,6,7], [1,6,8], [2,4,8], [2,4,9] जैसे हैं। , [2,6,7], [2,6,8], [3,4,8], [3,4,9], [3,5,7], [3,5,9]। अब सबसे छोटी राशि के साथ गिरने वाला पथ [1,5,7] है, तो उत्तर 13 है।

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

  • n :=पंक्तियों की संख्या, m :=स्तंभों की संख्या

  • इनिशियलाइज़ करने के लिए मैं :=1, जब i

    • सरणियों को बाएँ और दाएँ न्यूनतम आकार m

      . परिभाषित करें
    • लेफ्टमिन [0] :=arr[i - 1, 0]

    • इनिशियलाइज़ j :=1 के लिए, जब j

      • लेफ्टमिन [जे] :=कम से कम लेफ्टमिन [जे - 1] और एआर [i - 1, जे]

    • राइटमिन [एम - 1] =एआर [i - 1, एम -1]

    • इनिशियलाइज़ j :=m - 2 के लिए, जब j>=0, अपडेट करें (j को 1 से घटाएं), −

      करें
      • राइटमिन [जे]:=न्यूनतम गिरफ्तारी [i - 1, जे] और राइटमिन [जे + 1]

    • इनिशियलाइज़ j :=0 के लिए, जब j

      • लेफ्टवैल:=(यदि (जे -1)> =0, फिर लेफ्टमिन [जे -1], अन्यथा 1000000)

      • राइटवैल:=(अगर (जे + 1) <एम, फिर राइटमिन [जे + 1], अन्यथा 1000000)

      • arr[i, j] :=arr[i, j] + min(leftVal, rightVal)

  • Ans :=inf

  • इनिशियलाइज़ करने के लिए मैं :=0, जब i

    • उत्तर:=न्यूनतम उत्तर और गिरफ्तारी [n - 1, i]

  • वापसी उत्तर

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
int dp[10005][205];
class Solution {
   public:
   void pre(){
      for(int i = 0; i <= 10000; i++){
         for(int j = 0; j <=204; j++){
            dp[i][j] = -1;
         }
      }
   }
   int minFallingPathSum(vector<vector<int>>& arr) {
      int n = arr.size();
      int m = arr[0].size();
      for (int i = 1; i < n; i++) {
         vector<int> leftMin(m);
         vector<int> rightMin(m);
         leftMin[0] = arr[i - 1][0];
         for (int j = 1; j < m; j++) {
            leftMin[j] = min(leftMin[j - 1], arr[i - 1][j]);
         }
         rightMin[m - 1] = arr[i - 1][m - 1];
         for (int j = m - 2; j >= 0; j--) {
            rightMin[j] = min(arr[i - 1][j], rightMin[j + 1]);
         }
         for (int j = 0; j < m; j++) {
            int leftVal = (j - 1) >= 0 ? leftMin[j - 1] :
            1000000;
            int rightVal = (j + 1) < m ? rightMin[j + 1] :
            1000000;
            arr[i][j] += min(leftVal, rightVal);
         }
      }
      int ans = INT_MAX;
      for (int i = 0; i < m; i++)
      ans = min(ans, arr[n - 1][i]);
      return ans;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{1,2,3},{4,5,6},{7,8,9}};
   cout << (ob.minFallingPathSum(v));
}

इनपुट

{{1,2,3},{4,5,6},{7,8,9}}

आउटपुट

13

  1. सी++ में पथ योग III

    मान लीजिए कि हमने एक बाइनरी ट्री दिया है जिसमें प्रत्येक नोड में एक पूर्णांक कुंजी होती है। हमें उन पथों को खोजना है जो किसी दिए गए मान के योग हैं। रास्ता जड़ से पत्ती तक शुरू होना चाहिए। हमें वह रास्ता खोजना होगा जहां योग समान हो। अगर पेड़ [5,4,8,11,null,13,4,7,2,null,null,5,1] जैसा है, और योग 22

  1. C++ में एक बाइनरी ट्री में अधिकतम पथ योग

    इस समस्या में, हमें एक बाइनरी ट्री दिया जाता है जिसमें प्रत्येक नोड में एक मान होता है। हमारा काम एक बाइनरी ट्री की दो पत्तियों के बीच अधिकतम पथ योग खोजने के लिए एक प्रोग्राम बनाना है। यहां, हमें एक लीफ नोड से दूसरे लीफ नोड के लिए पथ फॉर्म ढूंढना होगा जो अधिकतम मूल्यों को प्रदान करेगा। इस अधिकतम यो

  1. पायथन में न्यूनतम पथ योग

    मान लीजिए कि हमारे पास गैर-ऋणात्मक पूर्णांकों से भरा एक m x n मैट्रिक्स है, तो ऊपरी बाएं कोने से नीचे दाएं कोने तक एक पथ खोजें जो इसके पथ के साथ सभी संख्याओं के योग को कम करता है। आंदोलन किसी भी समय केवल नीचे या दाएं हो सकते हैं। तो उदाहरण के लिए, यदि मैट्रिक्स नीचे जैसा है 1 3 1 1 5 1 4 2 1 आ