C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

増加部分と減少部分がC++の2つの異なる配列からのものであるような最長のビットニックシーケンスを見つけます


コンセプト

与えられた2つの配列に関して、増加する部分が最初の配列からのものであり、最初の配列のサブシーケンスである必要があるように、可能な限り長いバイトニックシーケンスを決定するタスク。同様に、の減少部分は2番目の配列からのものである必要があり、そのサブシーケンスである必要があります。

入力

arr1[] = {2, 6, 3, 5, 4, 6},
arr2[] = {9, 7, 5, 8, 4, 3}

出力

2, 3, 4, 6, 9, 7, 5, 4, 3

入力

arr1[] = {3, 1, 2, 4, 5},
arr2[] = {6, 4, 3, 2}

出力

1, 2, 4, 5, 6, 4, 3, 2

メソッド

したがって、概念は、array1から最長増加シーケンスを実装し、array2から最長減少シーケンスを実装してから、両方を組み合わせて結果を取得することです。

// CPP to find largest bitonic sequence such that
#include <bits/stdc++.h>
using namespace std;
vector<int> res1;
// Shows utility Binary search
int GetCeilIndex(int arr[], vector<int>& T1, int l1,
int r1, int key1){
   while (r1 - l1 > 1) {
      int m1 = l1 + (r1 - l1) / 2;
      if (arr[T1[m1]] >= key1)
         r1 = m1;
      else
         l1 = m1;
   }
   return r1;
}
// Shows function to find LIS in reverse form
void LIS(int arr[], int n){
   // Used to add boundary case, when array n is zero
   // Depend on smart pointers
   vector<int> tailIndices1(n, 0); // Initialized with 0
   vector<int> prevIndices1(n, -1); // initialized with -1
   int len1 = 1; // So it will always point to empty location
   for (int i = 1; i < n; i++) {
      // Shows new smallest value
      if (arr[i] < arr[tailIndices1[0]])
         tailIndices1[0] = i;
        // Now arr[i] wants to extend largest subsequence
      else if (arr[i] > arr[tailIndices1[len1 - 1]]) {
         prevIndices1[i] = tailIndices1[len1 - 1];
         tailIndices1[len1++] = i;
      }
      // Here, arr[i] wants to be a potential candidate of
      // future subsequence
      // It will replace ceil value in tailIndices
      else {
         int pos1 = GetCeilIndex(arr, tailIndices1, -1,
         len1 - 1, arr[i]);
         prevIndices1[i] = tailIndices1[pos1 - 1];
         tailIndices1[pos1] = i;
      }
   }
   // Used to put LIS(Longest Increasing Sequence) into vector
   for (int i = tailIndices1[len1 - 1]; i >= 0; i =
      prevIndices1[i])
      res1.push_back(arr[i]);
}
// Shows function for finding longest bitonic seq
void longestBitonic(int arr1[], int n1, int arr2[], int n2){
   // Determine LIS of array 1 in reverse form
   LIS(arr1, n1);
   // Used to reverse res to get LIS of first array
   reverse(res1.begin(), res1.end());
   // Used to reverse array2 and find its LIS
   reverse(arr2, arr2 + n2);
   LIS(arr2, n2);
   // Now print result
   for (int i = 0; i < res1.size(); i++)
      cout << res1[i] << " ";
}
// driver preogram
int main(){
   cout<<"Example:"<< endl;
   int arr1[] = {3, 1, 2, 4, 5};
   int arr2[] = {6, 4, 3, 2};
   int n1 = sizeof(arr1) / sizeof(arr1[0]);
   int n2 = sizeof(arr2) / sizeof(arr2[0]);
   longestBitonic(arr1, n1, arr2, n2);
   return 0;
}

出力

Example:
1 2 4 5 6 4 3 2

  1. C++で2つの要素が隣接しないような循環配列の最大合計

    この問題では、循環配列cirArr[]が与えられます。私たちのタスクは、C++で2つの要素が隣接しないように循環配列の最大合計を見つけるプログラムを作成することです。 問題の説明 循環配列の場合、隣接する要素を取得できないように、配列の要素の最大合計を見つける必要があります。つまり、代替要素を取得する必要があります。 循環アレイ は、配列の最後の要素が最初の要素に接続されている特殊なタイプの配列です。 問題を理解するために例を見てみましょう 入力 cirArr[] = {4, 1, 5, 3, 2} 出力 9 説明 最大合計循環サブシーケンスは[4、5、2]です。合計=9 ソリ

  2. 増加部分と減少部分がPythonの2つの異なる配列からのものであるような最長のバイトニックシーケンスを見つけます

    2つの配列があるとします。増加する部分が最初の配列からのものであり、最初の配列のサブシーケンスになるように、可能な限り長いビットニックシーケンスを見つける必要があります。同様に、の減少部分は、2番目の配列と2番目の配列のサブシーケンスからのものである必要があります。 したがって、入力がA =[2、6、3、5、4、6]、B =[9、7、5、8、4、3]の場合、出力は[2、3、4]になります。 、6、9、7、5、4、3] これを解決するには、次の手順に従います- 関数index_ceiling()を定義します。これには、arr、T、left、right、keyが必要です 1、実行