查找C ++中最长双子序列的长度的程序

假设我们有一个数字列表。我们必须找到最长的双子序列的长度。正如我们所知,如果严格地增加然后严格地减少,则该序列被称为二元序列。严格增加的顺序是双声的。或严格减少的顺序也是双音的。

因此,如果输入类似于nums = [0、8、4、12、2、10、6、14、1、9、5、13、11、7、15],序列16的大小,则输出将是7。

为了解决这个问题,我们将遵循以下步骤-

  • 增加SubSeq:=给定数组大小的新数组,并用1填充

  • 对于初始化i:= 1,当i <size时,更新(将i增加1),执行-

    • 对于初始化j:= size-1,当j> i时,更新(将j减1),-

    • 对于初始化i:= 1,当i <size时,更新(将i增加1),执行-

    • reductionSubSeq [i]:= reductionSubSeq [j] + 1

    • 如果arr [i]> arr [j],而reductionSubSeq [i] <reductionSubSeq [j] + 1,则-

    • 最大:=递增SubSeq [0] +递减SubSeq [0]-1

    • 最大值:=递增SubSeq [i] +递减SubSeq [i]-1

    • 如果递增SubSeq [i] +递减SubSeq [i]-1>最大值,则:

    • 最大回报

    • 如果arr [i]> arr [j]且递增的SubSeq [i] <递增的SubSeq [j] + 1,则-

    • * decreasingSubSeq:=给定数组大小的新数组,并用1填充

    • 递增SubSeq [i]:=增加SubSeq [j] + 1

    • 对于初始化j:= 0,当j <i时,更新(将j增加1),执行-

    • 对于初始化i:= size-2,当i> = 0时,更新(将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