C++で最も長く増加するサブシーケンスの数
これを解決するには、次の手順に従います-
- 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]
- nums [i]> nums [j]の場合、
- 0からi–1の範囲のjの場合
- ans:=0
- 0からn–1の範囲のiの場合
- len [i] =lisの場合、ans:=ans + cnt [j]
- 回答を返す
理解を深めるために、次の実装を見てみましょう-
#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
-
与えられたシーケンスの最長増加部分列を見つけるための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) 入力 :サブ配列と
-
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