给定一个整数数组。任务是在每次执行给定的两个操作后找到数组中所有元素的最大和。
操作是:
1. Select some(possibly none) continuous elements from the beginning of the array and multiply by -1.
2. Select some(possibly none) continuous elements from the end of the array and multiply by -1.
例子:
Input : arr[] = {-1, 10, -5, 10, -2}
Output : 18
After 1st operation : 1 10 -5 10 -2
After 2nd operation : 1 10 -5 10 2
Input : arr[] = {-9, -8, -7}
Output : 24
After 1st operation : 9 8 -7
After 2nd operation : 9 8 7
方法:这个问题可以在线性时间内解决,使用以下思路:
- 令A1 .. An元素的总和等于S。那么当反转符号时,我们得到-A1,-A2 .. -An,然后总和变为-S,即该段上的元素总和将改变当反转整个段的符号时,它的符号。
- 考虑初始问题如下:选择一个连续的子序列,并将其中剩余的所有数字取反。
- 使用 Kadane 算法求最大子数组和。
- 保持该子数组完好无损,并将其余部分乘以 -1。
- 将整个数组的总和视为 S,将最大和的连续子数组视为 S1,总和将等于 -(S-S1) + S1 = 2*S1 – S。这是所需的总和。
下面是上述方法的实现:
C++
// CPP program to find the maximum
// sum after given operations
#include
using namespace std;
// Function to calculate Maximum Subarray Sum
// or Kadane's Algorithm
int maxSubArraySum(int a[], int size)
{
int max_so_far = INT_MIN, max_ending_here = 0;
for (int i = 0; i < size; i++) {
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
// Function to find the maximum
// sum after given operations
int maxSum(int a[], int n)
{
// To store sum of all elements
int S = 0;
// Maximum sum of a subarray
int S1 = maxSubArraySum(a, n);
// Calculate the sum of all elements
for (int i = 0; i < n; i++)
S += a[i];
return (2 * S1 - S);
}
// Driver Code
int main()
{
int a[] = { -35, 32, -24, 0, 27, -10, 0, -19 };
// size of an array
int n = sizeof(a) / sizeof(a[0]);
cout << maxSum(a, n);
return 0;
}
Java
// Java program to find the maximum
// sum after given operations
import java.io.*;
class GFG {
// Function to calculate Maximum Subarray Sum
// or Kadane's Algorithm
static int maxSubArraySum(int a[], int size)
{
int max_so_far = Integer.MIN_VALUE, max_ending_here = 0;
for (int i = 0; i < size; i++) {
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
// Function to find the maximum
// sum after given operations
static int maxSum(int a[], int n)
{
// To store sum of all elements
int S = 0;
// Maximum sum of a subarray
int S1 = maxSubArraySum(a, n);
// Calculate the sum of all elements
for (int i = 0; i < n; i++)
S += a[i];
return (2 * S1 - S);
}
// Driver Code
public static void main (String[] args) {
int a[] = { -35, 32, -24, 0, 27, -10, 0, -19 };
// size of an array
int n = a.length;
System.out.println( maxSum(a, n));
}
}
// This code is contributed by inder_verma
Python3
# Python3 program to find the maximum
# sum after given operations
import sys
# Function to calculate Maximum
# Subarray Sum or Kadane's Algorithm
def maxSubArraySum(a, size) :
max_so_far = -(sys.maxsize - 1)
max_ending_here = 0
for i in range(size) :
max_ending_here = max_ending_here + a[i]
if (max_so_far < max_ending_here) :
max_so_far = max_ending_here
if (max_ending_here < 0) :
max_ending_here = 0
return max_so_far
# Function to find the maximum
# sum after given operations
def maxSum(a, n) :
# To store sum of all elements
S = 0;
# Maximum sum of a subarray
S1 = maxSubArraySum(a, n)
# Calculate the sum of all elements
for i in range(n) :
S += a[i]
return (2 * S1 - S)
# Driver Code
if __name__ == "__main__" :
a = [ -35, 32, -24, 0,
27, -10, 0, -19 ]
# size of an array
n = len(a)
print(maxSum(a, n))
# This code is contributed by Ryuga
C#
// C# program to find the maximum
// sum after given operations
using System;
class GFG {
// Function to calculate Maximum Subarray Sum
// or Kadane's Algorithm
static int maxSubArraySum(int []a, int size)
{
int max_so_far = int.MinValue, max_ending_here = 0;
for (int i = 0; i < size; i++) {
max_ending_here = max_ending_here + a[i];
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
if (max_ending_here < 0)
max_ending_here = 0;
}
return max_so_far;
}
// Function to find the maximum
// sum after given operations
static int maxSum(int []a, int n)
{
// To store sum of all elements
int S = 0;
// Maximum sum of a subarray
int S1 = maxSubArraySum(a, n);
// Calculate the sum of all elements
for (int i = 0; i < n; i++)
S += a[i];
return (2 * S1 - S);
}
// Driver Code
public static void Main () {
int []a = { -35, 32, -24, 0, 27, -10, 0, -19 };
// size of an array
int n = a.Length;
Console.WriteLine( maxSum(a, n));
}
}
// This code is contributed by inder_verma
PHP
Javascript
输出:
99