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

C++で最長のバイトニックサブシーケンスの長さを見つけるプログラム


番号のリストがあるとします。最長のビットニックサブシーケンスの長さを見つける必要があります。 Asweノットシーケンスは、厳密に増加してから厳密に減少する場合、バイトニックであると言われます。厳密に増加するシーケンスはバイトニックです。または、厳密に減少するシーケンスもバイトニックです。

したがって、入力がnums =[0、8、4、12、2、10、6、14、1、9、5、13、3、11、7、15]、シーケンス16のサイズのような場合、出力は7になります。

これを解決するには、次の手順に従います-

  • 増加するSubSeq:=指定された配列サイズの新しい配列。1で埋める

  • 初期化i:=1の場合、i <サイズの場合、更新(iを1増やします)、実行-

    • 初期化j:=0の場合、j

      • arr [i]>arr[j]およびincreaseSubSeq[i]

        • 増加するSubSeq[i]:=増加するSubSeq [j] + 1

      • *decreasingSubSeq:=指定された配列サイズの新しい配列。1で埋める

    • 初期化i:=size -2の場合、i> =0の場合、更新(iを1減らします)、実行-

      • 初期化j:=size -1の場合、j> iの場合、更新(jを1つ減らす)、実行-

        • arr [i]>arr[j]およびdecinancingSubSeq[i]

          • 減少するSubSeq[i]:=減少するSubSeq [j] + 1

        • max:=増加するSubSeq[0]+減少するSubSeq[0]-1

      • 初期化i:=1の場合、i <サイズの場合、更新(iを1増やします)、実行-

        • 増加するSubSeq[i]+減少するSubSeq[i]-1>最大の場合、次のようになります。

          • max:=増加するSubSeq[i]+減少するSubSeq[i]-1

        • 最大値を返す

理解を深めるために、次の実装を見てみましょう-

#include<iostream>
using namespace std;
int longBitonicSub( int arr[], int size ) {
   int *increasingSubSeq = new int[size];
   for (int i = 0; i < size; i++)
      increasingSubSeq[i] = 1;
   for (int i = 1; i < size; i++)
      for (int j = 0; j < i; j++)
         if (arr[i] > arr[j] && increasingSubSeq[i] <
         increasingSubSeq[j] + 1)
         increasingSubSeq[i] = increasingSubSeq[j] + 1;
   int *decreasingSubSeq = new int [size];
   for (int i = 0; i < size; i++)
      decreasingSubSeq[i] = 1;
   for (int i = size-2; i >= 0; i--)
      for (int j = size-1; j > i; j--)
         if (arr[i] > arr[j] && decreasingSubSeq[i] < decreasingSubSeq[j] + 1)
decreasingSubSeq[i] = decreasingSubSeq[j] + 1;
   int max = increasingSubSeq[0] + decreasingSubSeq[0] - 1;
   for (int i = 1; i < size; i++)
      if (increasingSubSeq[i] + decreasingSubSeq[i] - 1 > max)
         max = increasingSubSeq[i] + decreasingSubSeq[i] - 1;
   return max;
}
int main() {
   int arr[] = {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15};
   int n = 16;
   cout << longBitonicSub(arr, n);
}

入力

[0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15], 16

出力

7

  1. Pythonで最長のアナグラムサブシーケンスの長さを見つけるプログラム

    2つの小文字の文字列SとTがあるとすると、最長のアナグラムサブシーケンスの長さを見つける必要があります。 したがって、入力がS =helloworld、T =hellorldの場合、出力は8になります これを解決するには、次の手順に従います- c:=新しいマップ、d:=新しいマップ 0からaのサイズの範囲のiの場合、実行 cのa[i]の場合、 c [a [i]]:=c [a [i]] + 1 それ以外の場合 c [a [i]]:=1 0からbのサイズの範囲のiの場合、実行 dのb[i]の場合、 d [b [i]]:=

  2. Pythonで最も長いバランスの取れたサブシーケンスの長さを見つけるプログラム

    括弧「(」および「)」を含む文字列sがあるとすると、バランスの取れた括弧の最長のサブシーケンスの長さを見つける必要があります。 したがって、入力がs =())(()(の場合、出力は4になります。これは、 ()()のようなサブシーケンスを取ることができるためです。 これを解決するには、次の手順に従います- res:=0 n:=sのサイズ close:=0 n-1から0の範囲のiの場合、1ずつ減らします。 s[i]が)と同じ場合、 close:=close + 1 それ以外の場合 0の場合、 close:=close-1 r