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