String de copia de formulario N con operaciones de agregar, quitar y agregar

Una string se denomina string de N copias cuando está formada por N copias de la letra ‘G’. es decir, “GGGG” es una string de 4 copias ya que contiene 4 copias de la letra ‘G’. Inicialmente tenemos una string vacía en la que podemos realizar las siguientes tres operaciones: 
 

  1. Agregue una sola letra ‘G’ con un costo de X.
  2. Eliminar una sola letra ‘G’ con un costo de X.
  3. Agregue la string formada hasta ahora a sí misma con un costo de Y, es decir, tenemos la string ‘GG’, podemos agregarla a sí misma para hacer ‘GGGG’ 
    Dado N, X e Y, encuentre el costo mínimo para generar la string N-copia utilizando las operaciones anteriores

Ejemplos: 
 

Entrada: N = 4, X = 2, Y = 1 
Salida: 4  
Explicación: 
1) Inicialmente, la string está vacía, realizamos una operación Agregar para formar la string ‘G’. 
2) A continuación, realizamos una operación de tipo 3 y formamos la string ‘GG’. 
3) Nuevamente realizamos la operación 3 y formamos ‘GGGG’, que es la string de copias N requerida. 
Costo = X + Y + Y = 2 + 1 + 1 = 4
Entrada: N = 4, X = 1, Y = 3  
Salida: 4 
Podemos realizar 4 operaciones de suma consecutivas para formar ‘GGGG’. 
Costo = X + X + X + X = 1 + 1 + 1 + 1 = 4 

El problema se puede resolver utilizando un enfoque de programación dinámica. 
Si analizamos cuidadosamente las operaciones, es fácil ver que realizamos la operación de eliminación solo cuando hay una copia adicional a la requerida, esto solo puede ser el caso cuando antes de esta operación de eliminación había una operación de tipo 3 involucrada, porque si hubo una operación de tipo 1 antes, entonces no tiene sentido ya que las operaciones consecutivas de agregar y quitar solo aumentan el costo, sin introducir nuevas copias en nuestra string. 
Por lo tanto, podemos decir que tenemos las siguientes operaciones: 
1) Agregar un solo carácter ‘G’, con costo X 
2) Agregar la string a sí mismo y luego eliminar un solo carácter ‘G’, con costo Y + X 
3) Agregar la string a sí mismo, con costo Y 
Nota: A continuación nos referimos a estas operaciones modificadas.
Ahora, se puede resolver con un enfoque O(n) DP.
 

Si dp[i] representa el costo mínimo para formar una string de copia i 
, entonces las transiciones de estado pueden ser:
1) Si i es impar, 
Caso 1: Agregue un carácter a la string de copia (i-1)
Caso 2: Realice una operación de tipo 2 en la string de copia ((i+1)/2),
es decir, dp[i] = min(dp[i – 1] + X, dp[(i + 1) / 2)] + Y + X) 
2) Si i es par 
Caso 1: Agregue un carácter a la string de copia (i-1)
Caso 2: Realice una operación de tipo 3 en la string de copia (i/2)
, es decir, dp[i] = min(dp[i – 1] + X, dp[i / 2] + Y) 

C++

// CPP code to find minimum cost to form a
// N-copy string
#include <bits/stdc++.h>
 
using namespace std;
 
// Returns the minimum cost to form a n-copy string
// Here, x -> Cost to add/remove a single character 'G'
// and y-> cost to append the string to itself
int findMinimumCost(int n, int x, int y)
{
    int* dp = new int[n + 1];
 
    // Base Case: to form a 1-copy string we
    // need to perform an operation of type
    // 1(i.e Add)
    dp[1] = x;
 
    for (int i = 2; i <= n; i++) {
        if (i & 1) {
 
            // Case1. Perform a Add operation on
            //        (i-1)-copy string,
            // Case2. Perform a type 2 operation
            //        on ((i + 1) / 2)-copy string
            dp[i] = min(dp[i - 1] + x, dp[(i + 1) / 2] + y + x);
        }
        else {
 
            // Case1. Perform a Add operation on
            //        (i-1)-copy string,
            // Case2. Perform a type 3 operation on
            //        (i/2)-copy string
            dp[i] = min(dp[i - 1] + x, dp[i / 2] + y);
        }
    }
    return dp[n];
}
 
// Driver Code
int main()
{
    int n = 4, x = 2, y = 1;
    cout << findMinimumCost(n, x, y);
    return 0;
}

Java

// Java code to find minimum cost to form a
// N-copy string
class Solution
{
  
// Returns the minimum cost to form a n-copy string
// Here, x -> Cost to add/remove a single character 'G'
// and y-> cost to append the string to itself
static int findMinimumCost(int n, int x, int y)
{
    int dp[] = new int[n + 1];
  
    // Base Case: to form a 1-copy string we
    // need to perform an operation of type
    // 1(i.e Add)
    dp[1] = x;
  
    for (int i = 2; i <= n; i++) {
        if ((i & 1)!=0) {
  
            // Case1. Perform a Add operation on
            //        (i-1)-copy string,
            // Case2. Perform a type 2 operation
            //        on ((i + 1) / 2)-copy string
            dp[i] = Math.min(dp[i - 1] + x, dp[(i + 1) / 2] + y + x);
        }
        else {
  
            // Case1. Perform a Add operation on
            //        (i-1)-copy string,
            // Case2. Perform a type 3 operation on
            //        (i/2)-copy string
            dp[i] = Math.min(dp[i - 1] + x, dp[i / 2] + y);
        }
    }
    return dp[n];
}
  
// Driver Code
public static void main(String args[])
{
    int n = 4, x = 2, y = 1;
    System.out.println( findMinimumCost(n, x, y));
     
}
}
//contributed by Arnab Kundu

Python3

# Python3 code to find minimum cost to
# form a N-copy string
 
# function returns the minimum cost to
# form a n-copy string Here, x->Cost to
# add/remove a single character 'G' and
# y->cost to append the string to itself
 
def findMinimumCost(n, x, y):
    dp = [0 for i in range(n + 1)]
     
    # base case: ro form a 1-copy string
    #  we need tp perform an operation
    # of type 1(i,e Add)
    dp[1] = x
     
    for i in range(2, n + 1):
        if i & 1:
            # case1. Perform a Add operation
            #        on (i-1)copy string
            # case2. perform a type 2 operation
            #        on((i+1)/2)-copy string
            dp[i] = min(dp[i - 1] + x,
                        dp[(i + 1) // 2] + y + x)
        else:
 
            # case1. Perform a Add operation
            #        on (i-1)-copy string
            # case2. Perform a type # operation
            #        on (i/2)-copy string
            dp[i] = min(dp[i - 1] + x,
                        dp[i // 2] + y)
     
    return dp[n]
     
# Driver code
n, x, y = 4, 2, 1
 
print(findMinimumCost(n, x, y))
             
# This code is contributed
# by Mohit Kumar

C#

// C# code to find minimum cost to form a
// N-copy string
using System;
 
class GFG
{
 
// Returns the minimum cost to form a n-copy string
// Here, x -> Cost to add/remove a single character 'G'
// and y-> cost to append the string to itself
static int findMinimumCost(int n, int x, int y)
{
    int[] dp = new int[n + 1];
 
    // Base Case: to form a 1-copy string we
    // need to perform an operation of type
    // 1(i.e Add)
    dp[1] = x;
 
    for (int i = 2; i <= n; i++)
    {
        if ((i & 1)!=0)
        {
 
            // Case1. Perform a Add operation on
            //     (i-1)-copy string,
            // Case2. Perform a type 2 operation
            //     on ((i + 1) / 2)-copy string
            dp[i] = Math.Min(dp[i - 1] + x,
                             dp[(i + 1) / 2] + y + x);
        }
        else
        {
 
            // Case1. Perform a Add operation on
            //     (i-1)-copy string,
            // Case2. Perform a type 3 operation on
            //     (i/2)-copy string
            dp[i] = Math.Min(dp[i - 1] + x,
                             dp[i / 2] + y);
        }
    }
    return dp[n];
}
 
// Driver Code
public static void Main()
{
    int n = 4, x = 2, y = 1;
    Console.WriteLine(findMinimumCost(n, x, y));
}
}
 
// This code is contributed
// by Akanksha Rai

PHP

<?php
// PHP code to find minimum cost to form a
// N-copy string
 
// Returns the minimum cost to form a n-copy
// string. Here, x -> Cost to add/remove a
// single character 'G' and y-> cost to
// append the string to itself
function findMinimumCost($n, $x, $y)
{
    $dp[$n + 1] = array();
 
    // Base Case: to form a 1-copy string
    // we need to perform an operation of
    // type 1(i.e Add)
    $dp[1] = $x;
 
    for ($i = 2; $i <= $n; $i++)
    {
        if ($i & 1)
        {
 
            // Case1. Perform a Add operation on
            //        (i-1)-copy string,
            // Case2. Perform a type 2 operation
            //        on ((i + 1) / 2)-copy string
            $dp[$i] = min($dp[$i - 1] + $x,
                          $dp[($i + 1) / 2] + $y + $x);
        }
        else
        {
 
            // Case1. Perform a Add operation on
            //        (i-1)-copy string,
            // Case2. Perform a type 3 operation on
            //        (i/2)-copy string
            $dp[$i] = min($dp[$i - 1] + $x,
                          $dp[$i / 2] + $y);
        }
    }
    return $dp[$n];
}
 
// Driver Code
$n = 4;
$x = 2;
$y = 1;
echo findMinimumCost($n, $x, $y);
 
// This code is contributed by Sach_Code
?>

Javascript

<script>
 
    // Javascript code to find minimum cost to form a 
    // N-copy string
     
    // Returns the minimum cost to form a n-copy string
    // Here, x -> Cost to add/remove a single character 'G'
    // and y-> cost to append the string to itself
    function findMinimumCost(n, x, y)
    {
        let dp = new Array(n + 1);
 
        // Base Case: to form a 1-copy string we
        // need to perform an operation of type 
        // 1(i.e Add)
        dp[1] = x;
 
        for (let i = 2; i <= n; i++) {
            if ((i & 1)!=0) {
 
                // Case1. Perform a Add operation on 
                //        (i-1)-copy string,
                // Case2. Perform a type 2 operation 
                //        on ((i + 1) / 2)-copy string
                dp[i] = Math.min(dp[i - 1] + x, dp[parseInt((i + 1) / 2, 10)] + y + x);
            }
            else {
 
                // Case1. Perform a Add operation on 
                //        (i-1)-copy string,
                // Case2. Perform a type 3 operation on
                //        (i/2)-copy string
                dp[i] = Math.min(dp[i - 1] + x, dp[parseInt(i / 2, 10)] + y);
            }
        }
        return dp[n];
    }
     
    let n = 4, x = 2, y = 1;
    document.write(findMinimumCost(n, x, y));
 
</script>

Producción:

4

Tiempo Complejidad O(n) 
Espacio Auxiliar O(n)
 

Publicación traducida automáticamente

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