C++プログラムでサイズ3の増加するサブシーケンスの最大積
この問題では、n個の正の整数の配列arr[]が与えられます。私たちのタスクは、サイズ3の増加するサブシーケンスの最大積を見つけるプログラムを作成することです。
問題の説明 −ここでは、配列の3つの要素の最大積を見つけて、それらが増加するサブシーケンスを形成し、配列インデックスも増加するようにする必要があります。つまり、
arr[i]*arr[j]*arr[k] is maximum, arr[i]<arr[j]<arr[k] and i<j<k
問題を理解するために例を見てみましょう
入力
arr = {5, 9, 2, 11, 4, 7} 出力
495
説明
All subarrays of size 3 satisfying the condition are (5, 9, 11), prod = 5*9*11 = 495 (2, 4, 7), prod = 2*4*7 = 56 Maximum = 495
ソリューションアプローチ
問題を解決するための簡単なアプローチは、配列をループし、指定された条件を満たす3のすべてのサブ配列を見つけることです。
要素の積を見つけて、すべての積の最大値を返します。
アルゴリズム
初期化 −
maxProd = −1000
ステップ1 −
Loop i −> 0 to n−3
ステップ1.1 −
Loop j −> i to n−2
ステップ1.1.1 −
if(arr[i]< arr[j]) −> loop k −> j to n−1
ステップ1.1.1.1 −
if(arr[j] < arr[k]) −> find prod = arr[i]*arr[j]*arr[k].
ステップ1.1.1.2 −
if(maxProd > prod) −> maxProd = prod.
ステップ2 −
Return maxProd.
例
ソリューションの動作を説明するプログラム
#include <iostream>
using namespace std;
int calcMaxProd(int arr[], int n){
int maxProd = −1000;
int prod;
for (int i = 0; i < n − 2; i++)
for (int j = i + 1; j < n − 1; j++)
if(arr[i] < arr[j]){
for (int k = j + 1; k < n; k++){
if(arr[j] < arr[k]){
prod = arr[i] * arr[j] * arr[k];
if(maxProd < prod)
maxProd = prod;
}
}
}
return maxProd;
}
int main(){
int arr[] = { 5, 9, 2, 11, 4, 7 };
int n = sizeof(arr) / sizeof(arr[0]);
cout<<"The maximum product of an increasing subsequence of size 3
is "<<calcMaxProd(arr, n);
return 0;
} 出力
The maximum product of an increasing subsequence of size 3 is 495
このソリューションは簡単ですが、3つのネストされたループを使用するため、O(n3)の順序の時間計算量が大きくなります。それでは、問題の効率的な解決策を見てみましょう。
このソリューションでは、インデックス1からn-2までの配列の要素を取得します。そして、それを3要素サブアレイの中央要素として扱います。次に、配列から残りの2つの要素を見つけます。
Element smaller than arr[i] in array with index less than i. Element greater than aar[i] in array with index more than i.
最小の要素は、自己平衡二分探索木を使用して検出され、最大の要素は、右から左にトラバースして、右の最大要素を検索します。
両方の値を見つけた後、要素サブ配列のprodを見つけ、次にすべてを比較してmaxProdを見つけます。
例
ソリューションの動作を説明するプログラム
#include<bits/stdc++.h>
using namespace std;
long calMaxSubSeqProd(int arr[] , int n) {
int smallerLeftEle[n];
smallerLeftEle[0] = −1 ;
set<int>small ;
for (int i = 0; i < n ; i++) {
auto it = small.insert(arr[i]);
auto val = it.first;
−−val;
if (val != small.end())
smallerLeftEle[i] = *val;
else
smallerLeftEle[i] = −1;
}
long maxProd = −10000;
long prod ;
int greaterRightEle = arr[n−1];
for (int i= n−2 ; i >= 1; i−−) {
if (arr[i] > greaterRightEle)
greaterRightEle = arr[i];
else if (smallerLeftEle[i] != −1){
prod = smallerLeftEle[i]*arr[i]*greaterRightEle;
if(prod > maxProd)
maxProd = prod;
}
}
return maxProd;
}
int main() {
int arr[] = {5, 9, 2, 11, 4, 7};
int n = sizeof(arr)/sizeof(arr[0]);
cout<<"The maximum product of an increasing subsequence of size 3
is "<<calMaxSubSeqProd(arr, n);
return 0;
} 出力
The maximum product of an increasing subsequence of size 3 is 495
-
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 [j]の場合、 len [i]の場合、len [i]:=len [j] + 1、およびcnt [i]:=cnt [j] それ以外の場合、len [j] +
-
与えられたシーケンスの最長増加部分列を見つけるための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) 入力 :サブ配列と