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

C++ . में अनक्रॉस्ड लाइन्स

मान लीजिए कि हमने A और B के पूर्णांकों को दो अलग-अलग क्षैतिज रेखाओं पर (उनके दिए गए क्रम में) लिखा है। अब, हम जोड़ने वाली रेखाएँ खींच सकते हैं:दो संख्याओं A[i] और B[j] को जोड़ने वाली एक सीधी रेखा इस प्रकार कि -

  • ए [i] ==बी [जे];

  • वह रेखा जो हम खींचते हैं जो किसी अन्य जोड़ने वाली (गैर-क्षैतिज) रेखा को नहीं काटती है।

हमें यह ध्यान रखना होगा कि जोड़ने वाली रेखाएं अंतिम बिंदुओं पर भी प्रतिच्छेद नहीं कर सकती हैं - प्रत्येक संख्या केवल एक जोड़ने वाली रेखा से संबंधित हो सकती है। कनेक्टिंग लाइनों की अधिकतम संख्या पाएं। तो अगर इनपुट [1,4,2] और [1,2,4] जैसा है, तो आउटपुट 2 होगा।

1 4 2
1 2 4

हम चित्र के अनुसार 2 बिना क्रॉस की रेखाएँ खींच सकते हैं। हम 3 बिना क्रॉस की रेखाएँ नहीं खींच सकते, ऐसा इसलिए है क्योंकि A[1]=4 से B[2]=4 तक की रेखा A[2]=2 से B[1]=2 तक की रेखा को काटेगी।

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

  • हल () नामक एक विधि को परिभाषित करें, इसमें i, j, सरणी A, सरणी B और मैट्रिक्स dp लगेगा।

  • अगर मैं सरणी ए की सीमा से बाहर हूं, तो 0 पर लौटें

  • यदि j सरणी B की सीमा से बाहर है, तो 0 पर लौटें

  • एनजे:=जे

  • जबकि nj

    • nj को 1 से बढ़ाएं

  • अस्थायी:=1 जब nj

  • रिट:=अधिकतम (समाधान (i + 1, j, A, B, dp) और अस्थायी) + हल करें (i + 1, nj + 1, A, B, dp)

  • dp[i, j] :=ret and return ret

  • मुख्य विधि से

  • n:=A का आकार, m:=B का आकार

  • n x m आकार का एक मैट्रिक्स dp बनाएं और इसे - 1

    . से भरें
  • कॉल हल (0, 0, ए, डीपी)

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

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(int i, int j, vector <int>&A, vector <int>&B, vector <
   vector <int> >& dp){
      if(i >= A.size()) return 0;
      if(j >= B.size()) return 0;
      if(dp[i][j] != -1) return dp[i][j];
      int nj = j;
      while(nj < B.size() && B[nj] != A[i]) nj++;
      int ret = max(solve(i + 1, j, A, B, dp), (nj < B.size() ? 1 :
      0) + solve(i + 1, nj + 1, A, B, dp));
      return dp[i][j] = ret;
   }
   int maxUncrossedLines(vector<int>& A, vector<int>& B) {
      int n = A.size();
      int m = B.size();
      vector < vector <int > > dp(n, vector <int>(m, -1));
      return solve(0, 0, A, B, dp);
   }
};
main(){
   vector<int> v1 = {1,4,2};
   vector<int> v2 = {1,2,4};
   Solution ob;
   cout << (ob.maxUncrossedLines(v1, v2));
}

इनपुट

[1,4,2]
[1,2,4]

आउटपुट

2

  1. सी ++ में एक सरणी में क्रॉस लाइनों की गणना करना

    हमें अलग-अलग तत्वों की एक सरणी दी गई है जो क्रमबद्ध नहीं हैं। लक्ष्य सरणी को क्रमबद्ध करने के बाद क्रॉस लाइनों को खोजना है। क्रॉस लाइन की गणना नीचे दर्शाए अनुसार की जाती है - Arr[]={ 1,2,4,3,5 } नीचे दिखाए गए अनुसार 3 क्रॉस लाइन हैं एआर [] ={ 1,2,3,4,5}। कोई क्रॉस लाइन नहीं है क्योंकि सरणी

  1. सी++ में दो लाइनों के चौराहे के बिंदु के लिए कार्यक्रम

    रेखा AB के संगत बिंदु A और B दिए गए हैं और रेखा PQ के संगत बिंदु P और Q दिए गए हैं; कार्य इन दो पंक्तियों के बीच प्रतिच्छेदन बिंदु को खोजना है। नोट - X और Y निर्देशांकों पर 2D समतल में अंक दिए गए हैं। यहाँ A(a1, a2), B(b1, b2) और C(c1, c2), D(d1, d2) निर्देशांक हैं जो दो अलग-अलग रेखाएँ बना रहे ह

  1. C++ . में पहचानकर्ता

    C++ पहचानकर्ता एक ऐसा नाम है जिसका उपयोग किसी चर, फ़ंक्शन, वर्ग, मॉड्यूल, या किसी अन्य उपयोगकर्ता-परिभाषित आइटम की पहचान करने के लिए किया जाता है। एक पहचानकर्ता अक्षर A से Z या a से z या अंडरस्कोर (_) से शुरू होता है और उसके बाद शून्य या अधिक अक्षर, अंडरस्कोर और अंक (0 से 9) होते हैं। C++ पहचानकर्त