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

C++プログラムでDPを使用した最大合計増加部分列


この問題では、サイズnの配列arr[]が与えられます。私たちのタスクは、C++でDPを使用して最大の合計増加部分列を見つけるプログラムを作成することです。

問題の説明 −合計が増加する最大のサブシーケンスを見つけるために、次の要素が現在の要素よりも大きいサブシーケンスを作成します。

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

入力

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

出力

20

説明

Increasing subsequence with maximum sum:
{2, 3, 6, 9} = 2 + 3 + 6 + 9 = 20

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

動的プログラムアプローチを使用して問題を解決する。現在の要素までの最大合計を格納する配列を作成します。次に、配列からmaxSumを返します。

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

#include <iostream>
using namespace std;
int retMaxVal(int x, int y){
   if(x > y)
   return x;
   return y;
}
int calcMaxSubSeqSum(int arr[], int n) {
   int maxSum = 0;
   int sumDP[n];
   for (int i = 0; i < n; i++ )
   sumDP[i] = arr[i];
   for (int i = 1; i < n; i++ )
   for (int j = 0; j < i; j++ )
   if ( (sumDP[i] < (sumDP[j] + arr[i])) && ( arr[i] >
   arr[j] ) )
   sumDP[i] = sumDP[j] + arr[i];
   for (int i = 0; i < n; i++ )
   maxSum = retMaxVal(sumDP[i], maxSum);
   return maxSum;
}
int main() {
   int arr[] = {4, 2, 3, 6, 5, 9};
   int n = sizeof(arr)/sizeof(arr[0]);
   cout<<"The maximum Sum Increasing Subsequence using DP is
   "<<calcMaxSubSeqSum(arr, n);
   return 0;
}

出力

Sum of maximum sum increasing subsequence is 20

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

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

  2. 二分探索アプローチを使用して最大サブアレイ合計を見つけるC++プログラム

    二分探索は、実行時の複雑さがΟ(log n)の高速検索アルゴリズムです。この検索アルゴリズムは、分割統治の原則に基づいて機能します。このアルゴリズムが正しく機能するためには、データ収集がソートされた形式である必要があります。 バイナリ検索は、コレクションの真ん中のアイテムを比較することによって特定のアイテムを検索します。一致する場合は、アイテムのインデックスが返されます。中央のアイテムがアイテムよりも大きい場合、そのアイテムは中央のアイテムの左側にあるサブ配列で検索されます。それ以外の場合、アイテムは中央のアイテムの右側のサブ配列で検索されます。このプロセスは、サブアレイのサイズがゼロになる