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

C++での最大合計バイトニックサブアレイ


この問題では、配列arr[]が与えられます。私たちのタスクは、C++で最大の合計バイトニックサブアレイを見つけるプログラムを作成することです。

Bitonicサブアレイ は、要素が最初に厳密に増加し、特定のポイントに到達した後に厳密に減少する特別なサブ配列です。

問題を理解するために例を見てみましょう

入力

arr[] = {4, 2, 3, 7 ,9, 6, 3, 5, 1}

出力

30

説明

バイトニックサブアレイは[2、3、7、9、6、3]です。合計=2 + 3 + 7 + 9 + 6 + 3 =30

ソリューションアプローチ

解決策は、ビットニック部分列問題の解決策と似ています。 2つの配列incSubArr[]とdecSubArr[]を作成します。これにより、ストアの増加および減少するサブ配列が作成されます。インデックスiで、incSubArr[i]はサブ配列が0からiに増加していることを検出します。そして、decSubArr [i]は、サブアレイがiからNに増加していることを検出します。

maxSumは、(incSubArr [i] + decSubArr [i] --arr [i])として計算される最大値です。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
int findMaxSumBiTonicSubArr(int arr[], int N){
   int incSubArr[N], decSubArr[N];
   int max_sum = -1;
   incSubArr[0] = arr[0];
   for (int i=1; i<N; i++)
      if (arr[i] > arr[i-1])
         incSubArr[i] = incSubArr[i-1] + arr[i];
      else
         incSubArr[i] = arr[i];
   decSubArr[N-1] = arr[N-1];
   for (int i= (N-2); i>=0; i--)
      if (arr[i] > arr[i+1])
         decSubArr[i] = decSubArr[i+1] + arr[i];
      else
         decSubArr[i] = arr[i];
   for (int i=0; i<N; i++)
      if(max_sum < (incSubArr[i] + decSubArr[i] - arr[i]))
max_sum = incSubArr[i] + decSubArr[i] - arr[i];
   return max_sum;
}
int main(){
   int arr[] = {4, 2, 3, 7 ,9, 6, 3, 5, 1};
   int N = sizeof(arr) / sizeof(arr[0]);
   cout<<"The Maximum Sum of Bitonic Subarray is "<<findMaxSumBiTonicSubArr(arr, N);
   return 0;
}

出力

The Maximum Sum of Bitonic Subarray is 30

  1. C++で厳密に増加するサブアレイの最大合計を見つける

    n個の整数の配列があるとします。厳密に増加するサブ配列の最大合計を求めます。したがって、配列が[1、2、3、2、5、1、7]のような場合、合計は8になります。この配列には、厳密に増加する3つのサブ配列があります。これらは{1、2、3}、{2 、5}および{1、7}。最大合計サブ配列は{1、7}です。 この問題を解決するには、最大合計と現在の合計を追跡する必要があります。各要素arr[i]について、これがarr [i – 1]より大きい場合は、これを現在の合計に加算します。それ以外の場合、arr[i]は別のサブアレイの開始点です。したがって、現在の合計を配列として更新します。現在の合計を更新す

  2. C++で分割統治法を使用した最大合計サブアレイ

    正の値と負の値を持つデータのリストが1つあるとします。合計が最大である連続するサブ配列の合計を見つける必要があります。リストに{-2、-5、6、-2、-3、1、5、-6}が含まれているとすると、最大サブ配列の合計は7になります。これは{6、-2、-3の合計です。 、1、5} この問題は、分割統治法を使用して解決します。手順は次のようになります- 手順 − アレイを2つの部分に分割します 次の3つの最大値を見つけます 左側のサブアレイの最大サブアレイ合計 右サブアレイの最大サブアレイ合計 サブアレイが中点を横切るようなサブアレイの最大合計 例 #include <iostr