Suma total mínima de las dos arrays dadas

Dados dos arreglos A[] y B[] de N enteros positivos y un costo C . Podemos elegir cualquier elemento de cada índice de las arrays dadas, es decir, para cualquier índice i podemos elegir solo el elemento A[i] o B[i] . La tarea es encontrar la suma total mínima de seleccionar N elementos de las dos arrays dadas y si estamos seleccionando cualquier elemento de A[] a B[] o viceversa en la siguiente iteración, entonces el costo C también se suma al suma. 

Nota: Elija el elemento en orden creciente de índice, es decir, 0 ≤ i < N .

Ejemplos: 

Entrada: N = 9, A[] = {7, 6, 18, 6, 16, 18, 1, 17, 17}, B[] = {6, 9, 3, 10, 9, 1, 10, 1 , 5}, C = 2 
Salida: 49 
Explicación: 
Al tomar el primer elemento del arreglo A, suma = 7 
Al tomar el segundo elemento del arreglo A, suma = 7 + 6 = 13 
Al tomar el tercer elemento del arreglo B, como estamos ingresando de la array A a la array B, suma = 13 + 3 + 2 = 18 
Al tomar el cuarto elemento de la array A, como estamos ingresando de la array B a la array A, suma = 18 + 6 + 2 = 26 
Al tomar el 5to elemento del arreglo B, como estamos ingresando del arreglo A al arreglo B, suma = 26 + 9 + 2 = 37 
Al tomar el 6to elemento del arreglo B, suma = 37 + 1 = 38 
Al tomar el séptimo elemento del arreglo A, mientras ingresamos del arreglo B al arreglo A, suma = 38 + 1 + 2 = 41 
Al tomar el octavo elemento del arreglo B, mientras ingresamos del arreglo A al arreglo B, suma = 41 + 1 + 2 = 44 
Al tomar el noveno elemento de la array B, suma = 44 + 5 = 49.

Entrada: N = 9, A = {3, 2, 3, 1, 3, 3, 1, 4, 1}, B = {1, 2, 3, 4, 4, 1, 2, 1, 3}, C = 1 
Salida: 18 
Explicación: 
Al tomar el primer elemento del arreglo B, suma = 1 
Al tomar el segundo elemento del arreglo A, suma = 1 + 2 = 3 
Al tomar el tercer elemento del arreglo A, suma = 3 + 3 = 6 
Al tomar el 4to elemento del arreglo A, suma = 6 + 1 = 7 
Al tomar el 5to elemento del arreglo A, suma = 7 + 3 = 10 
Al tomar el 6to elemento del arreglo B, ya que estamos ingresando desde el arreglo A al arreglo B, suma = 10 + 1 + 1 = 12 
Al tomar el 7mo elemento del arreglo A, como estamos ingresando del arreglo B al arreglo A, suma = 12 + 1 + 1 = 14 
Al tomar el octavo elemento del arreglo B, mientras ingresamos del arreglo A al arreglo B, suma = 14 + 1 + 1 = 16 
Al tomar el noveno elemento del arreglo A, mientras ingresamos del arreglo B al arreglo A, suma = 16 + 1 + 1 = 18. 
 

Enfoque: Usaremos Programación Dinámica para resolver este problema. A continuación se muestran los pasos:  

  1. Cree una array 2D dp[][] de N filas y dos columnas e inicialice todos los elementos de dp hasta el infinito .
  2. Puede haber 4 casos posibles de agregar los elementos de ambas arrays: 
    • Agregar un elemento de la array a[] cuando el elemento agregado anteriormente es de la array a[].
    • Agregar un elemento de la array a[] cuando el elemento agregado anteriormente es de la array b[]. En este caso hay una penalización de sumar el entero C con el resultado.
    • Agregar un elemento de la array b[] cuando el elemento agregado anteriormente es de la array b[].
    • Agregar un elemento de la array b[] cuando el elemento agregado anteriormente es de la array a[]. En este caso hay una penalización de sumar el entero C con el resultado.
  3. Actualice la array dp cada vez con el valor mínimo de las cuatro condiciones anteriores.
  4. El mínimo de dp[n-1][0] y dp[n-1][1] es la suma mínima total de seleccionar N elementos.

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 that prints minimum sum
// after selecting N elements
void minimumSum(int a[], int b[],
                int c, int n)
{
 
    // Initialise the dp array
    vector<vector<int> > dp(n,
                            vector<int>(2,
                                        1e6));
 
    // Base Case
    dp[0][0] = a[0];
    dp[0][1] = b[0];
 
    for (int i = 1; i < n; i++) {
 
        // Adding the element of array a if
        // previous element is also from array a
        dp[i][0] = min(dp[i][0],
                    dp[i - 1][0] + a[i]);
 
        // Adding the element of array a if
        // previous element is from array b
        dp[i][0] = min(dp[i][0],
                    dp[i - 1][1] + a[i] + c);
 
        // Adding the element of array b if
        // previous element is from array a
        // with an extra penalty of integer C
        dp[i][1] = min(dp[i][1],
                    dp[i - 1][0] + b[i] + c);
 
        // Adding the element of array b if
        // previous element is also from array b
        dp[i][1] = min(dp[i][1],
                    dp[i - 1][1] + b[i]);
    }
 
    // Print the minimum sum
    cout << min(dp[n - 1][0],
                dp[n - 1][1])
        << "\n";
}
 
// Driver Code
int main()
{
    // Given array arr1[] and arr2[]
    int arr1[] = { 7, 6, 18, 6, 16,
                18, 1, 17, 17 };
 
    int arr2[] = { 6, 9, 3, 10, 9,
                1, 10, 1, 5 };
 
    // Given cost
    int C = 2;
 
    int N = sizeof(arr1) / sizeof(arr1[0]);
 
    // Function Call
    minimumSum(arr1, arr2, C, N);
 
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Function that prints minimum sum
// after selecting N elements
static void minimumSum(int a[], int b[],
                       int c, int n)
{
     
    // Initialise the dp array
    int [][]dp = new int[n][2];
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            dp[i][j] = (int) 1e6;
        }
    }
     
    // Base Case
    dp[0][0] = a[0];
    dp[0][1] = b[0];
 
    for(int i = 1; i < n; i++)
    {
         
        // Adding the element of array a if
        // previous element is also from array a
        dp[i][0] = Math.min(dp[i][0],
                            dp[i - 1][0] + a[i]);
 
        // Adding the element of array a if
        // previous element is from array b
        dp[i][0] = Math.min(dp[i][0],
                            dp[i - 1][1] + a[i] + c);
 
        // Adding the element of array b if
        // previous element is from array a
        // with an extra penalty of integer C
        dp[i][1] = Math.min(dp[i][1],
                            dp[i - 1][0] + b[i] + c);
 
        // Adding the element of array b if
        // previous element is also from array b
        dp[i][1] = Math.min(dp[i][1],
                            dp[i - 1][1] + b[i]);
    }
 
    // Print the minimum sum
    System.out.print(Math.min(dp[n - 1][0],
                              dp[n - 1][1]) + "\n");
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Given array arr1[] and arr2[]
    int arr1[] = { 7, 6, 18, 6, 16,
                   18, 1, 17, 17 };
 
    int arr2[] = { 6, 9, 3, 10, 9,
                   1, 10, 1, 5 };
 
    // Given cost
    int C = 2;
 
    int N = arr1.length;
 
    // Function call
    minimumSum(arr1, arr2, C, N);
}
}
 
// This code is contributed by gauravrajput1

Python3

# Python3 program for the above approach
 
# Function that prints minimum sum
# after selecting N elements
def minimumSum(a, b, c, n):
     
    # Initialise the dp array
    dp = [[1e6 for i in range(2)]
            for j in range(n)]
 
    # Base Case
    dp[0][0] = a[0]
    dp[0][1] = b[0]
 
    for i in range(1, n):
 
        # Adding the element of array a if
        # previous element is also from array a
        dp[i][0] = min(dp[i][0],
                    dp[i - 1][0] + a[i])
 
        # Adding the element of array a if
        # previous element is from array b
        dp[i][0] = min(dp[i][0],
                    dp[i - 1][1] + a[i] + c)
 
        # Adding the element of array b if
        # previous element is from array a
        # with an extra penalty of integer C
        dp[i][1] = min(dp[i][1],
                    dp[i - 1][0] + b[i] + c)
 
        # Adding the element of array b if
        # previous element is also from array b
        dp[i][1] = min(dp[i][1],
                    dp[i - 1][1] + b[i])
 
    # Print the minimum sum
    print(min(dp[n - 1][0], dp[n - 1][1]))
 
# Driver code
if __name__ == '__main__':
 
    # Given array arr[]
    arr1 = [ 7, 6, 18, 6, 16,
            18, 1, 17, 17 ]
 
    arr2 = [ 6, 9, 3, 10, 9,
            1, 10, 1, 5 ]
 
    # Given cost
    C = 2
 
    N = len(arr1)
 
    # Function Call
    minimumSum(arr1, arr2, C, N)
 
# This code is contributed by Shivam Singh

C#

// C# program for the above approach
using System;
 
class GFG{
 
// Function that prints minimum sum
// after selecting N elements
static void minimumSum(int []a, int []b,
                       int c, int n)
{
     
    // Initialise the dp array
    int [,]dp = new int[n, 2];
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < 2; j++)
        {
            dp[i, j] = (int)1e6;
        }
    }
     
    // Base Case
    dp[0, 0] = a[0];
    dp[0, 1] = b[0];
 
    for(int i = 1; i < n; i++)
    {
         
        // Adding the element of array a if
        // previous element is also from array a
        dp[i, 0] = Math.Min(dp[i, 0],
                            dp[i - 1, 0] + a[i]);
 
        // Adding the element of array a if
        // previous element is from array b
        dp[i, 0] = Math.Min(dp[i, 0],
                            dp[i - 1, 1] + a[i] + c);
 
        // Adding the element of array b if
        // previous element is from array a
        // with an extra penalty of integer C
        dp[i, 1] = Math.Min(dp[i, 1],
                            dp[i - 1, 0] + b[i] + c);
 
        // Adding the element of array b if
        // previous element is also from array b
        dp[i, 1] = Math.Min(dp[i, 1],
                            dp[i - 1, 1] + b[i]);
    }
 
    // Print the minimum sum
    Console.Write(Math.Min(dp[n - 1, 0],
                           dp[n - 1, 1]) + "\n");
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Given array arr1[] and arr2[]
    int []arr1 = { 7, 6, 18, 6, 16,
                   18, 1, 17, 17 };
 
    int []arr2 = { 6, 9, 3, 10, 9,
                   1, 10, 1, 5 };
 
    // Given cost
    int C = 2;
 
    int N = arr1.Length;
 
    // Function call
    minimumSum(arr1, arr2, C, N);
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
// JavaScript program for the above approach
 
// Function that prints minimum sum
// after selecting N elements
function minimumSum(a, b, c, n)
{
     
    // Initialise the dp array
    let dp =  new Array(n);
    for (var i = 0; i < dp.length; i++) {
    dp[i] = new Array(2);
    }
 
    for(let i = 0; i < n; i++)
    {
        for(let j = 0; j < 2; j++)
        {
            dp[i][j] = 1e6;
        }
    }
     
    // Base Case
    dp[0][0] = a[0];
    dp[0][1] = b[0];
 
    for(let i = 1; i < n; i++)
    {
         
        // Adding the element of array a if
        // previous element is also from array a
        dp[i][0] = Math.min(dp[i][0],
                            dp[i - 1][0] + a[i]);
 
        // Adding the element of array a if
        // previous element is from array b
        dp[i][0] = Math.min(dp[i][0],
                            dp[i - 1][1] + a[i] + c);
 
        // Adding the element of array b if
        // previous element is from array a
        // with an extra penalty of integer C
        dp[i][1] = Math.min(dp[i][1],
                            dp[i - 1][0] + b[i] + c);
 
        // Adding the element of array b if
        // previous element is also from array b
        dp[i][1] = Math.min(dp[i][1],
                            dp[i - 1][1] + b[i]);
    }
 
    // Print the minimum sum
    document.write(Math.min(dp[n - 1][0],
                              dp[n - 1][1]) + "<br/>");
}
 
// Driver Code
 
    // Given array arr1[] and arr2[]
    let arr1 = [ 7, 6, 18, 6, 16,
                   18, 1, 17, 17 ];
 
    let arr2 = [ 6, 9, 3, 10, 9,
                   1, 10, 1, 5 ];
 
    // Given cost
    let C = 2;
 
    let N = arr1.length;
 
    // Function call
    minimumSum(arr1, arr2, C, N);
 
</script>
Producción: 

49

 

Complejidad de tiempo: O(N)
 

Publicación traducida automáticamente

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