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

সি++-এ আনক্রসড লাইনস (Uncrossed Lines)


মান লেযিয়ে A এবং B অ্যারের পূর্ণসংখ্যাগুলো ক্রমশ দুটি আলাদা অনুভূমিক রেখায় লেখা হয়েছে। এখন আমরা সংযোগ রেখা আঁকতে পারি: একটি সরল রেখা A[i] এবং B[j]-কে সংযুক্ত করবে যদি -

  • A[i] == B[j];

  • আঁকা রেখা অন্য কোনো সংযোগ রেখা (অনুভূমিক ব্যতীত) ছেদ করে না।

ধরে রাখতে হবে যে সংযোগ রেখাগুলো এন্ডপয়েন্টে যেকোনোভাবে ছেদ করতে পারবে না - প্রতিটি সংখ্যা শুধু একটি সংযোগ রেখার অংশ হতে পারে। সর্বাধিক সংখ্যক সংযোগ রেখা খুঁজে বের করতে হবে। ইনপুট [1,4,2] এবং [1,2,4] হলে আউটপুট হবে ২।

142
124

ডায়াগ্রাম অনুযায়ী ২টি আনক্রসড লাইন আঁকা যায়। ৩টি আঁকা যাবে না, কারণ A[1]=4 থেকে B[2]=4 পর্যন্ত의 রেখা A[2]=2 থেকে B[1]=2 পর্যন্তের রেখাকে ছেদ করবে।

এটি সমাধান করার জন্য আমরা নিচের ধাপগুলো অনুসরণ করব -

  • solve() নামে একটি মেথড সংজ্ঞায়িত করুন, যা i, j, অ্যারে A, অ্যারে B এবং dp ম্যাট্রিক্স নেবে

  • যদি i অ্যারে A-এর রেঞ্জ বাইরে হয়, ০ রিটার্ন করুন

  • যদি j অ্যারে B-এর রেঞ্জ বাইরে হয়, ০ রিটার্ন করুন

  • nj := j

  • যখন nj < B.size() এবং B[nj] != A[i], nj বড়ান

  • temp := 1 যদি nj < B.size() হয়, অন্যথায় ০

  • ret := max(solve(i+1, j, A, B, dp), temp + solve(i+1, nj+1, A, B, dp))

  • dp[i][j] := ret এবং ret রিটার্ন করুন

  • মেইন মেথড থেকে - n := A.size(), m := B.size()

  • n x m আকারের dp ম্যাট্রিক্স তৈরি করুন, -1 দিয়ে পূরণ করুন

  • solve(0, 0, A, B, dp) কল করুন

নিচের বাস্তবায়নটি দেখে আরও ভালো বুঝতে পারবেন -

উদাহরণ

#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. সি++-এ অ্যারেতে ক্রস লাইন গণনা

  2. দুটি রেখার ছেদবিন্দু খুঁজে বের করার জন্য C++ প্রোগ্রাম

  3. C++-এ এনক্যাপসুলেশন

  4. C++-এ আইডেন্টিফায়ার (Identifiers)