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

C ++で最大1つの要素を削除した後、サブアレイの最大合計を最大化します


問題の説明

N個の整数の配列arr[]が与えられます。タスクは、最初に最大のサブ配列の合計を見つけてから、サブ配列から最大で1つの要素を削除することです。削除後の最大合計が最大になるように、最大​​で1つの要素を削除します。

指定された入力配列が{1、2、3、-2、3}の場合、サブ配列の最大合計は{1、3、-2、3}です。次に、-2を削除できます。残りのアレイを削除すると、次のようになります-

{1, 2, 3, 3} with sum 9 which is maximum.

アルゴリズム

1. Use Kadane’s algorithm to find the maximum subarray sum.
2. Once the sum has beens find, re-apply Kadane’s algorithm to find the maximum sum again with some minor changes)

#include <bits/stdc++.h>
using namespace std;
int getMaxSubarraySum(int *arr, int n){
   int max = INT_MIN;
   int currentMax = 0;
   for (int i = 0; i < n; ++i) {
      currentMax = currentMax + arr[i];
      if (max < currentMax) {
         max = currentMax;
      }
      if (currentMax < 0) {
         currentMax = 0;
      }
   }
   return max;
}
int getMaxSum(int *arr, int n){
   int cnt = 0;
   int minVal = INT_MAX;
   int minSubarr = INT_MAX;
   int sum = getMaxSubarraySum(arr, n);
   int max = INT_MIN;
   int currentMax = 0;
   for (int i = 0; i < n; ++i) {
      currentMax = currentMax + arr[i];
      ++cnt;
      minSubarr = min(arr[i], minSubarr);
      if (sum == currentMax) {
         if (cnt == 1) {
            minVal = min(minVal, 0);
         } else {
            minVal = min(minVal, minSubarr);
         }
      }
      if (currentMax < 0) {
         currentMax = 0;
         cnt = 0;
         minSubarr = INT_MAX;
      }
   }
   return sum - minVal;
}
int main(){
   int arr[] = {1, 2, 3, -2, 3};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Maximum sum = " << getMaxSum(arr, n) << endl;
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

Maximum sum = 9

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

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

  2. C++でのK否定後の配列合計を最大化する

    問題の説明 サイズnと数kの配列が与えられます。配列をk回変更する必要があります。 配列の変更とは、各操作で、配列要素arr [i]を否定することで置き換えることができることを意味します。つまり、arr [i] =-arr[i]です。タスクは、k回の操作の後、配列の合計が最大になるようにこの操作を実行することです。 input arr [] ={7、-3、5、4、-1}の場合、最大合計は20になります。 最初に-3を否定します。これで、配列は{7、3、5、4、-1}になります 負の-1。これで、配列は{7、3、5、4、1}になります アルゴリズム 1. Replace the min