কম্পিউটার

বাইনারি ট্রিতে নোডের সর্বাধিক যোগফল যাতে দুটি সংলগ্ন নয় | C++ এ ডায়নামিক প্রোগ্রামিং


এই টিউটোরিয়ালে, আমরা বাইনারি ট্রিতে নোডের সর্বাধিক যোগফল খুঁজে বের করার জন্য একটি প্রোগ্রাম নিয়ে আলোচনা করব যাতে ডায়নামিক প্রোগ্রামিং ব্যবহার করে কোন দুটি সংলগ্ন না হয়।

এর জন্য আমাদের একটি বাইনারি গাছ দেওয়া হবে। আমাদের কাজ হল সর্বাধিক যোগফল সহ উপসেট খুঁজে বের করা যাতে উপসেটের কোন দুটি নোড ডাইনামিক প্রোগ্রামিং ব্যবহার করে সরাসরি সংযুক্ত থাকে না।

উদাহরণ

#include <bits/stdc++.h>
using namespace std;
//finding diameter using dynamic programming
void dfs(int node, int parent, int dp1[], int dp2[], list<int>* adj, int tree[]){
   int sum1 = 0, sum2 = 0;
   for (auto i = adj[node].begin(); i != adj[node].end();
      ++i) {
         if (*i == parent)
            continue;
         dfs(*i, node, dp1, dp2, adj, tree);
         sum1 += dp2[*i];
         sum2 += max(dp1[*i], dp2[*i]);
      }
      dp1[node] = tree[node] + sum1;
      dp2[node] = sum2;
}
int main() {
   int n = 5;
   list<int>* adj = new list<int>[n + 1];
   adj[1].push_back(2);
   adj[2].push_back(1);
   adj[1].push_back(3);
   adj[3].push_back(1);
   adj[2].push_back(4);
   adj[4].push_back(2);
   adj[2].push_back(5);
   adj[5].push_back(2);
   int tree[n + 1];
   tree[1] = 10;
   tree[2] = 5;
   tree[3] = 11;
   tree[4] = 6;
   tree[5] = 8;
   int dp1[n + 1], dp2[n + 1];
   memset(dp1, 0, sizeof dp1);
   memset(dp2, 0, sizeof dp2);
   dfs(1, 1, dp1, dp2, adj, tree);
   cout << "Maximum sum: " << max(dp1[1], dp2[1]) << endl;
   return 0;
}

আউটপুট

Maximum sum: 25

  1. বৃত্তাকার অ্যারেতে সর্বাধিক যোগফল যাতে C++ এ দুটি উপাদান সংলগ্ন থাকে না

  2. C++ এ বাইনারি ট্রিতে সর্বাধিক সর্পিল যোগফল

  3. C++ এ বাইনারি ট্রিতে সর্বোচ্চ উল্লম্ব যোগফল খুঁজুন

  4. C++ প্রোগ্রামিং-এ বাইনারি ট্রিতে যেকোনো দুটি নোডের মধ্যে প্রিন্ট পাথ।