K sumas máximas de subarreglos contiguos que no se superponen

Dada una array de enteros y un valor entero k, encuentre k sub-arrays no superpuestas que tengan k sumas máximas.
 

Ejemplos: 

Input : arr1[] = {4, 1, 1, -1, -3, -5, 6, 2, -6, -2}, 
             k = 3.
Output : Maximum non-overlapping sub-array sum1: 8, 
         starting index: 6, ending index: 7.
         
         Maximum non-overlapping sub-array sum2: 6, 
         starting index: 0, ending index: 2.
         
         Maximum non-overlapping sub-array sum3: -1, 
         starting index: 3, ending index: 3.

Input : arr2 = {5, 1, 2, -6, 2, -1, 3, 1}, 
           k = 2.
Output : Maximum non-overlapping sub-array sum1: 8, 
         starting index: 0, ending index: 2.

         Maximum non-overlapping sub-array sum2: 5, 
         starting index: 4, ending index: 7.

Requisito previo: Algoritmo de Kadane El algoritmo
de Kadane encuentra solo la suma máxima de subarreglo, pero usando el mismo algoritmo podemos encontrar k sumas máximas de subarreglo que no se superponen. El enfoque es: 

  • Averigüe el subarreglo máximo en el arreglo usando el algoritmo de Kadane. Averigüe también sus índices inicial y final. Imprime la suma de este subarreglo.
  • Rellene cada celda de este subarreglo por -infinito.
  • Repita el proceso 1 y 2 por k veces. 

C++

// C++ program to find out k maximum
// non-overlapping sub-array sums.
#include <bits/stdc++.h>
using namespace std;
 
// Function to compute k maximum
// sub-array sums.
void kmax(int arr[], int k, int n) {
 
    // In each iteration it will give
    // the ith maximum subarray sum.
    for(int c = 0; c < k; c++){
 
        // Kadane's algorithm.
        int max_so_far = numeric_limits<int>::min();
        int max_here = 0;
 
        // compute starting and ending
        // index of each of the sub-array.
        int start = 0, end = 0, s = 0;
        for(int i = 0; i < n; i++)
        {
            max_here += arr[i];
            if (max_so_far < max_here)
            {
                max_so_far = max_here;
                start = s;
                end = i;
            }
            if (max_here < 0)
            {
                max_here = 0;
                s = i + 1;
            }
        }
 
        // Print out the result.
        cout << "Maximum non-overlapping sub-array sum"
             << (c + 1) << ": "<< max_so_far
             << ", starting index: " << start
             << ", ending index: " << end << "." << endl;
 
        // Replace all elements of the maximum subarray
        // by -infinity. Hence these places cannot form
        // maximum sum subarray again.
        for (int l = start; l <= end; l++)
            arr[l] = numeric_limits<int>::min();
    }
    cout << endl;
}
 
// Driver Program
int main()
{
    // Test case 1
    int arr1[] = {4, 1, 1, -1, -3,
                 -5, 6, 2, -6, -2};
    int k1 = 3;
    int n1 = sizeof(arr1) / sizeof(arr1[0]);
     
    // Function calling
    kmax(arr1, k1, n1);
 
    // Test case 2
    int arr2[] = {5, 1, 2, -6, 2, -1, 3, 1};
    int k2 = 2;
    int n2 = sizeof(arr2)/sizeof(arr2[0]);
     
    // Function calling
    kmax(arr2, k2, n2);
     
    return 0;
}

Java

// Java program to find out k maximum
// non-overlapping sub-array sums.
 
class GFG {
 
    // Method to compute k maximum
    // sub-array sums.
    static void kmax(int arr[], int k, int n) {
     
        // In each iteration it will give
        // the ith maximum subarray sum.
        for(int c = 0; c < k; c++)
        {
            // Kadane's algorithm.
            int max_so_far = Integer.MIN_VALUE;
            int max_here = 0;
     
            // compute starting and ending
            // index of each of the sub-array.
            int start = 0, end = 0, s = 0;
            for(int i = 0; i < n; i++)
            {
                max_here += arr[i];
                if (max_so_far < max_here)
                {
                    max_so_far = max_here;
                    start = s;
                    end = i;
                }
                if (max_here < 0)
                    {
                    max_here = 0;
                    s = i + 1;
                }
            }
     
            // Print out the result.
            System.out.println("Maximum non-overlapping sub-arraysum" +
                                (c + 1) + ": " +  max_so_far +
                                ", starting index: " + start +
                                ", ending index: " + end + ".");
     
            // Replace all elements of the maximum subarray
            // by -infinity. Hence these places cannot form
            // maximum sum subarray again.
            for (int l = start; l <= end; l++)
                arr[l] = Integer.MIN_VALUE;
        }
        System.out.println();
    }
     
    // Driver Program
    public static void main(String[] args)
    {
        // Test case 1
        int arr1[] = {4, 1, 1, -1, -3, -5,
                            6, 2, -6, -2};
        int k1 = 3;
        int n1 = arr1.length;
         
        // Function calling
        kmax(arr1, k1, n1);
     
        // Test case 2
        int arr2[] = {5, 1, 2, -6, 2, -1, 3, 1};
        int k2 = 2;
        int n2 = arr2.length;
         
        // Function calling
        kmax(arr2, k2, n2);
    }
}
 
// This code is contributed by Nirmal Patel

Python3

# Python program to find out k maximum
# non-overlapping subarray sums.
 
# Function to compute k
# maximum sub-array sums.
def kmax(arr, k, n):
 
    # In each iteration it will give
    # the ith maximum subarray sum.
    for c in range(k):
 
        # Kadane's algorithm
        max_so_far = -float("inf")
        max_here = 0
 
        # compute starting and ending
        # index of each of the subarray
        start = 0
        end = 0
        s = 0
        for i in range(n):
             
            max_here += arr[i]
            if (max_so_far < max_here):
                 
                max_so_far = max_here
                start = s
                end = i
            if (max_here < 0):
                 
                max_here = 0
                s = i + 1
 
        # Print out the result
        print("Maximum non-overlapping sub-array sum",
               c + 1, ": ", max_so_far, ", starting index: ",
               start, ", ending index: ", end, ".", sep = "")
 
        # Replace all elements of the maximum subarray
        # by -infinity. Hence these places cannot form
        # maximum sum subarray again.
        for l in range(start, end+1):
            arr[l] = -float("inf")
    print()
 
# Driver Program
# Test case 1
arr1 = [4, 1, 1, -1, -3, -5, 6, 2, -6, -2]
k1 = 3
n1 = len(arr1)
 
# Function calling
kmax(arr1, k1, n1)
 
# Test case 2
arr2 = [5, 1, 2, -6, 2, -1, 3, 1]
k2 = 2
n2 = len(arr2)
 
# Function calling
kmax(arr2, k2, n2)

C#

// C# program to find out k maximum
// non-overlapping sub-array sums.
using System;
 
class GFG {
 
    // Method to compute k
    // maximum sub-array sums.
    static void kmax(int []arr, int k, int n) {
     
        // In each iteration it will give
        // the ith maximum subarray sum.
        for(int c = 0; c < k; c++)
        {
            // Kadane's algorithm.
            int max_so_far = int.MinValue;
            int max_here = 0;
     
            // compute starting and ending
            // index of each of the sub-array.
            int start = 0, end = 0, s = 0;
            for(int i = 0; i < n; i++)
            {
                max_here += arr[i];
                if (max_so_far < max_here)
                {
                    max_so_far = max_here;
                    start = s;
                    end = i;
                }
                if (max_here < 0)
                {
                    max_here = 0;
                    s = i + 1;
                }
            }
     
            // Print out the result.
            Console.WriteLine("Maximum non-overlapping sub-arraysum" +
                              (c + 1) + ": "+ max_so_far +
                              ", starting index: " + start +
                              ", ending index: " + end + ".");
     
            // Replace all elements of the maximum subarray
            // by -infinity. Hence these places cannot form
            // maximum sum subarray again.
            for (int l = start; l <= end; l++)
                arr[l] = int.MinValue;
        }
    Console.WriteLine();
    }
     
    // Driver Program
    public static void Main(String[] args)
    {
        // Test case 1
        int []arr1 = {4, 1, 1, -1, -3, -5,
                            6, 2, -6, -2};
        int k1 = 3;
        int n1 = arr1.Length;
         
        // Function calling
        kmax(arr1, k1, n1);
     
        // Test case 2
        int []arr2 = {5, 1, 2, -6, 2, -1, 3, 1};
        int k2 = 2;
        int n2 = arr2.Length;
         
        // Function calling
        kmax(arr2, k2, n2);
    }
}
 
// This code is contributed by parashar...

PHP

<?php
// PHP program to find out k maximum
// non-overlapping sub-array sums.
 
    // Method to compute k
    // maximum sub-array sums.
    function kmax($arr, $k, $n) {
     
        // In each iteration it will give
        // the ith maximum subarray sum.
        for( $c = 0; $c < $k; $c++)
        {
            // Kadane's algorithm.
            $max_so_far = PHP_INT_MIN;
            $max_here = 0;
     
            // compute starting and ending
            // index of each of the sub-array.
            $start = 0; $end = 0; $s = 0;
            for($i = 0; $i < $n; $i++)
            {
                $max_here += $arr[$i];
                if ($max_so_far < $max_here)
                {
                    $max_so_far = $max_here;
                    $start = $s;
                    $end = $i;
                }
                if ($max_here < 0)
                {
                    $max_here = 0;
                    $s = $i + 1;
                }
            }
     
            // Print out the result.
            echo "Maximum non-overlapping sub-arraysum" ;
            echo ($c + 1) , ": ", $max_so_far ;
            echo", starting index: " , $start ;
            echo", ending index: " , $end , ".";
            echo"\n";
     
            // Replace all elements of the maximum subarray
            // by -infinity. Hence these places cannot form
            // maximum sum subarray again.
            for ( $l = $start; $l <= $end; $l++)
                $arr[$l] = PHP_INT_MIN;
        }
        echo "\n";
    }
     
    // Driver Program
        // Test case 1
        $arr1 = array(4, 1, 1, -1, -3, -5,
                            6, 2, -6, -2);
        $k1 = 3;
        $n1 = count($arr1);
         
        // Function calling
        kmax($arr1, $k1, $n1);
     
        // Test case 2
        $arr2 = array(5, 1, 2, -6, 2, -1, 3, 1);
        $k2 = 2;
        $n2 =count($arr2);
         
        // Function calling
        kmax($arr2, $k2, $n2);
 
// This code is contributed by anuj_67.
?>

Javascript

<script>
 
// JavaScript program to find out k maximum
// non-overlapping sub-array sums.
 
// Function to compute k maximum
// sub-array sums.
function kmax(arr, k, n)
{
     
    // In each iteration it will give
    // the ith maximum subarray sum.
    for(let c = 0; c < k; c++)
    {
         
        // Kadane's algorithm.
        let max_so_far = -2147483648;
        let max_here = 0;
 
        // compute starting and ending
        // index of each of the sub-array.
        let start = 0, end = 0, s = 0;
        for(let i = 0; i < n; i++)
        {
            max_here += arr[i];
             
            if (max_so_far < max_here)
            {
                max_so_far = max_here;
                start = s;
                end = i;
            }
            if (max_here < 0)
            {
                max_here = 0;
                s = i + 1;
            }
        }
 
        // Print out the result.
        document.write("Maximum non-overlapping " +
                       "sub-array sum" + (c + 1) +
                       ": " + max_so_far +
                       ", starting index: " + start +
                       ", ending index: " + end +
                       "." + "<br>");
 
        // Replace all elements of the maximum subarray
        // by -infinity. Hence these places cannot form
        // maximum sum subarray again.
        for(let l = start; l <= end; l++)
            arr[l] = -2147483648;
    }
    document.write("<br>");
}
 
// Driver code
 
// Test case 1
let arr1 = [ 4, 1, 1, -1, -3,
            -5, 6, 2, -6, -2 ];
let k1 = 3;
let n1 = arr1.length;
 
// Function calling
kmax(arr1, k1, n1);
 
// Test case 2
let arr2 = [ 5, 1, 2, -6,
             2, -1, 3, 1 ];
let k2 = 2;
let n2 = arr2.length;
 
// Function calling
kmax(arr2, k2, n2);
     
// This code is contributed by Surbhi Tyagi.
 
</script>

Producción: 

Maximum non-overlapping sub-array sum1: 8, starting index: 6, ending index: 7.
Maximum non-overlapping sub-array sum2: 6, starting index: 0, ending index: 2.
Maximum non-overlapping sub-array sum3: -1, starting index: 3, ending index: 3.

Maximum non-overlapping sub-array sum1: 8, starting index: 0, ending index: 2.
Maximum non-overlapping sub-array sum2: 5, starting index: 4, ending index: 7.

Complejidad de tiempo: el ciclo externo se ejecuta durante k veces y el algoritmo de Kadane en cada iteración se ejecuta en tiempo lineal O (n). Por lo tanto, la complejidad temporal total es O(k*n).
Espacio Auxiliar : O(1)

Publicación traducida automáticamente

Artículo escrito por egoista 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 *