Suma máxima de prefijos después de K reversiones de una array dada

Dada una array arr[] de tamaño N y un entero positivo K , la tarea es encontrar la suma máxima de prefijos después de K inversiones de la array dada. 

Ejemplos:

Entrada: arr[] = {1, 5, 8, 9, 11, 2}, K = 1
Salida: 36
Explicación: Invierta la array una vez. Por lo tanto, la array se convierte en {2, 11, 9, 8, 5, 1}. Suma máxima de prefijos = 2 + 11 + 9 + 8 + 5 + 1 = 36. 

Entrada: arr[] = {5, 6, -4, 3, -2, -10}, K = 2
Salida: 11
Explicación: Invierta la array dos veces. Por lo tanto, la array se convierte en {5, 6, -4, 3, -2, -10}. Suma máxima de prefijos = 5 + 6=11. 

Enfoque ingenuo: el enfoque más simple es invertir la array K veces y después de K reversiones , encontrar la suma máxima de prefijos posible al atravesar la array e imprimir la suma máxima. 
Complejidad temporal: O(N * K)
Espacio auxiliar: O(1)

Enfoque eficiente: para optimizar el enfoque anterior, la idea se basa en la observación de que si K es impar , entonces la array se invierte. De lo contrario, la array permanece sin cambios. Por lo tanto, si K es impar , encuentre la suma máxima de sufijos. De lo contrario, encuentre la suma máxima de prefijos. Siga los pasos a continuación para resolver el problema:

  • Inicialice sum como INT_MIN para almacenar la respuesta requerida.
  • Si K es impar , invierta la array arr[] .
  • Inicialice currSum como 0 para almacenar la suma de elementos del prefijo.
  • Recorra la array arr[] usando la variable i y realice lo siguiente:
    • Agregue arr[i] a la variable currSum .
    • Si el valor de currSum es mayor que sum , actualice la suma como currSum .
  • Después de los pasos anteriores, imprima el valor de la suma como resultado.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the maximum prefix
// sum after K reversals of the array
int maxSumAfterKReverse(int arr[],
                        int K, int N)
{
    // Stores the required sum
    int sum = INT_MIN;
 
    // If K is odd, reverse the array
    if (K & 1)
        reverse(arr, arr + N);
 
    // Store current prefix sum of array
    int currsum = 0;
 
    // Traverse the array arr[]
    for (int i = 0; i < N; i++) {
 
        // Add arr[i] to currsum
        currsum += arr[i];
 
        // Update maximum prefix sum
        // till now
        sum = max(sum, currsum);
    }
 
    // Print the answer
    cout << sum;
}
 
// Driver Code
int main()
{
    int arr[] = { 1, 5, 8, 9, 11, 2 };
    int K = 1;
    int N = sizeof(arr) / sizeof(arr[0]);
 
    // Function Call
    maxSumAfterKReverse(arr, K, N);
 
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG
{
 
  // Function to find the maximum prefix
  // sum after K reversals of the array
  static void maxSumAfterKReverse(Integer arr[], int K, int N)
  {
     
    // Stores the required sum
    int sum = Integer.MIN_VALUE;
 
    // If K is odd, reverse the array
    if (K % 2 != 0)
      Collections.reverse(Arrays.asList(arr));
 
    // Store current prefix sum of array
    int currsum = 0;
 
    // Traverse the array arr[]
    for (int i = 0; i < N; i++)
    {
 
      // Add arr[i] to currsum
      currsum += arr[i];
 
      // Update maximum prefix sum
      // till now
      sum = Math.max(sum, currsum);
    }
 
    // Print the answer
    System.out.print(sum);
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    Integer[] arr = { 1, 5, 8, 9, 11, 2 };
    int K = 1;
    int N = arr.length;
 
    // Function Call
    maxSumAfterKReverse(arr, K, N);
  }
}
 
// This code is contributed by Dharanendra L V.

Python3

# Python3 program for the above approach
import sys
 
# Function to find the maximum prefix
# sum after K reversals of the array
def maxSumAfterKReverse(arr, K, N) :
     
    # Stores the required sum
    sum = -sys.maxsize - 1
 
    # If K is odd, reverse the array
    if (K & 1) :
        arr.reverse()
 
    # Store current prefix sum of array
    currsum = 0
 
    # Traverse the array arr[]
    for i in range(N):
 
        # Add arr[i] to currsum
        currsum += arr[i]
 
        # Update maximum prefix sum
        # till now
        sum = max(sum, currsum)
     
    # Print the answer
    print(sum)
 
# Driver Code
arr = [ 1, 5, 8, 9, 11, 2 ]
K = 1
N = len(arr)
 
# Function Call
maxSumAfterKReverse(arr, K, N)
 
# This code is contributed by code_hunt.

C#

// C# program for the above approach
using System;
 
class GFG{
 
  // Function to find the maximum prefix
  // sum after K reversals of the array
  static void maxSumAfterKReverse(int[] arr, int K, int N)
  {
 
    // Stores the required sum
    int sum = Int32.MinValue;
 
    // If K is odd, reverse the array
    if (K % 2 != 0)
      Array.Reverse(arr);
 
    // Store current prefix sum of array
    int currsum = 0;
 
    // Traverse the array arr[]
    for (int i = 0; i < N; i++)
    {
 
      // Add arr[i] to currsum
      currsum += arr[i];
 
      // Update maximum prefix sum
      // till now
      sum = Math.Max(sum, currsum);
    }
 
    // Print the answer
    Console.Write(sum);
  }
 
  // Driver Code
  public static void Main(string[] args)
  {
    int[] arr = { 1, 5, 8, 9, 11, 2 };
    int K = 1;
    int N = arr.Length;
 
    // Function Call
    maxSumAfterKReverse(arr, K, N);
  }
}
 
// This code is contributed by sanjoy_62.

Javascript

<script>
 
// Javascript program for the above approach
 
  // Function to find the maximum prefix
  // sum after K reversals of the array
  function maxSumAfterKReverse(arr, K, N)
  {
      
    // Stores the required sum
    let sum = Number.MIN_VALUE;
  
    // If K is odd, reverse the array
    if (K % 2 != 0)
      arr.reverse();
  
    // Store current prefix sum of array
    let currsum = 0;
  
    // Traverse the array arr[]
    for (let i = 0; i < N; i++)
    {
  
      // Add arr[i] to currsum
      currsum += arr[i];
  
      // Update maximum prefix sum
      // till now
      sum = Math.max(sum, currsum);
    }
  
    // Print the answer
    document.write(sum);
  }
 
// Driver Code
 
      let arr = [ 1, 5, 8, 9, 11, 2 ];
    let K = 1;
    let N = arr.length;
  
    // Function Call
    maxSumAfterKReverse(arr, K, N);
  
</script>

  

Producción: 

36

 

Complejidad temporal: O(N)
Espacio auxiliar: O(1) 

Publicación traducida automáticamente

Artículo escrito por shubhampokhriyal2018 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *