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

C++で最大K個の配列要素の符号を反転することによる最大サブ配列の合計


この問題では、配列と整数kが与えられます。私たちのタスクは、C++で最大k個の配列要素の符号を反転することによって最大のサブ配列の合計を見つけるプログラムを作成することです。

コードの説明 −ここでは、配列を反転する最大k個の要素を見つける必要があります。これにより、この配列から作成されたサブ配列の合計が最大になります。

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

入力 −配列={1、-2、7、0} k =2

出力 − 10

説明 − -2である1つの要素のみを反転します。これにより、配列の合計が最大になる10になります。

この問題を解決するために、動的計画法を使用して、i th から配列の可能な最大の合計を見つけます。 j th へのインデックス インデックスを作成して配列maxSumij[i][j]に格納し、要素が反転した場合と要素が反転していない場合の両方のケースを考慮して、これが最良のケースを返します。これは、関数への再帰呼び出しを使用して行われます。最後に、maxSumij[i][j]行列から最大の要素を見つけます。

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

#include <bits/stdc++.h>
using namespace std;
#define right 2
#define left 4
int arraySumij[left][right];
int findSubarraySum(int i, int flips, int n, int a[], int k){
   if (flips > k)
      return -1e9;
   if (i == n)
      return 0;
   if (arraySumij[i][flips] != -1)
      return arraySumij[i][flips];
   int maxSum = 0;
   maxSum = max(0, a[i] + findSubarraySum(i + 1, flips, n, a, k));
   maxSum = max(maxSum, -a[i] + findSubarraySum(i + 1, flips + 1, n, a, k));
   arraySumij[i][flips] = maxSum;
   return maxSum;
}
int maxSubarraySumFlip(int a[], int n, int k){
   memset(arraySumij, -1, sizeof(arraySumij));
   int maxSum = -100;
   for (int i = 0; i < n; i++)
      maxSum = max(maxSum, findSubarraySum(i, 0, n, a, k));
   return maxSum;
}
int main() {
   int a[] = {-3, 56, -1, 8};
   int n = sizeof(a) / sizeof(a[0]);
   int k = 2;
   cout<<"Maximum subarry sum by fipping signs of at most "<<k<<" element is "<<maxSubarraySumFlip(a, n, k);
   return 0;
}

出力

Maximum subarry sum by fipping signs of at most 2 element is 66

  1. C++で最大2つの要素を反転した後の最大サブアレイ合計

    この問題では、配列が与えられます。私たちのタスクは、C++で最大2つの要素を反転した後に最大のサブ配列の合計を見つけるプログラムを作成することです。 問題の説明 −ここでは、配列の任意の2つの数値の符号を反転したときに最大の合計を生成するサブ配列を見つける必要があります。 問題を理解するために例を見てみましょう 入力 −配列={-5、1、3、8、-2、4、7} 出力 − 30 説明 −インデックス0から6までの要素を検討し、値-5と-2を反転して、最大合計の配列を取得します。 この問題を解決するために、動的計画法を使用します。サイズ1からn(配列の長さ)のすべてのサブ配列の最大

  2. C++の配列の最大平衡合計

    問題の説明 配列arr[]が与えられます。 arr[]のインデックスiのサフィックス合計でもあるプレフィックス合計の最大値を見つけます。 例 入力配列が-の場合 Arr [] ={1、2、3、5、3、2、1}の場合、出力は次のように11になります- プレフィックス合計=arr[0..3] =1 + 2 + 3 + 5=11および サフィックスの合計=arr[3..6] =5 + 3 + 2 + 1 =11 アルゴリズム 配列をトラバースし、各インデックスのプレフィックスの合計を配列presum []に格納します。ここで、presum[i]はサブ配列arr[0..i]の合計を格納し