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

C++で1回削除した場合の最大サブアレイ合計


整数の配列があるとします。最大で1つの要素が削除された、空でないサブアレイ(連続する要素)の最大合計を見つける必要があります。つまり、サブ配列を選択し、オプションで1つの要素を削除して、少なくとも1つの要素が残り、残りの要素の合計が可能な限り最大になるようにする必要があると言えます。 1つの要素を削除した後は、サブ配列が空でない必要があることに注意する必要があります。したがって、入力が[1、-2,0,3]の場合、出力は4になります。したがって、-2を削除すると、最大合計が返されます。

これを解決するには、次の手順に従います-

  • n:=配列のサイズ、および:=a [0]
  • suff_with_del:=0、suff_with_out_del:=a [0]
  • iからn–1の範囲のiの場合
    • suff_with_del:=suff_with_del +a[i]およびsuff_with_out_delの最大値
    • suff_with_out_del:=a[i]の最大値とsuff_with_out_del+a [i]
    • ans:=ansの最大値、suff_with_out_delおよびsuff_with _del
  • return res

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int maximumSum(vector<int>& a) {
      int n = a.size();
      int ans = a[0];
      int suffix_with_deletion = 0;
      int suffix_with_not_deletion = a[0];
      for(int i = 1;i<n;i++){
         suffix_with_deletion = max(suffix_with_deletion + a[i], suffix_with_not_deletion);
         suffix_with_not_deletion = max(a[i],suffix_with_not_deletion+a[i]);
         ans = max({ans, suffix_with_not_deletion,suffix_with_deletion});
      }
      return ans;
   }
};
main(){
   vector<int> v = {1,-2,0,3};
   Solution ob;
   cout <<ob.maximumSum(v);
}

入力

[1,-2,0,3]

出力

4

  1. 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 maximu

  2. 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]は別のサブアレイの開始点です。したがって、現在の合計を配列として更新します。現在の合計を更新す