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

C++で最も長く増加するサブシーケンスの数


ソートされていない整数の配列が1つあるとします。最長増加部分列の数を見つける必要があるため、入力が[1、3、5、4、7]の場合、増加部分列は[1,3,5,7]であり、出力は2になります。 [1、3、4、7]

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

  • n:=num配列のサイズ、サイズnの2つの配列lenとcntを作成し、それらに値1を入力します。
  • lis:=1
  • 1からnの範囲のiの場合
    • 0からi–1の範囲のjの場合
      • nums [i]> nums [j]の場合、
        • len [j] + 1> len [i]の場合、len [i]:=len [j] + 1、およびcnt [i]:=cnt [j]
        • それ以外の場合、len [j] + 1 =len [j]の場合、cnt [i]:=cnt [i] + cnt [j]
      • lis:=lisとlenの最大値[j]
  • ans:=0
  • 0からn–1の範囲のiの場合
    • len [i] =lisの場合、ans:=ans + cnt [j]
  • 回答を返す
例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int findNumberOfLIS(vector<int>& nums) {
      int n = nums.size();
      vector <int> len(n, 1), cnt(n, 1);
      int lis = 1;
      for(int i = 1; i < n; i++){
         for(int j = 0; j < i; j++){
            if(nums[i] > nums[j]){
               if(len[j] + 1 > len[i]){
                  len[i] = len[j] + 1;
                  cnt[i] = cnt[j];
               }
               else if(len[j] + 1 == len[i]){
                  cnt[i] += cnt[j];
               }
            }
            lis = max(lis, len[i]);
         }
      }
      int ans = 0;
      for(int i = 0; i < n; i++){
         if(len[i] == lis)ans += cnt[i];
      }
      return ans;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,3,5,4,7};
   cout << (ob.findNumberOfLIS(v));
}

入力

[1,3,5,4,7]

出力

2

  1. 与えられたシーケンスの最長増加部分列を見つけるためのC++プログラム

    最長増加部分列は、1つの項目が前の項目よりも大きい部分列です。 ここでは、整数のセットから最長増加部分列の長さを見つけようとします。 Input: A set of integers. {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15} Output: The length of longest increasing subsequence. Here it is 6. The subsequence is 0, 2, 6, 9, 13, 15. アルゴリズム longestSubSeq(subarray、n) 入力 :サブ配列と

  2. C++のCHAR_BIT

    CHAR_BITは、charのビット数です。これは、C++言語の「limits.h」ヘッダーファイルで宣言されています。 1バイトあたり8ビットです。 これがC++言語のCHAR_BITの例です 例 #include <bits/stdc++.h> using namespace std; int main() {    int x = 28;    int a = CHAR_BIT*sizeof(x);    stack<bool> s;    cout << "T