Cómo imprimir el número máximo de A usando las cuatro teclas dadas

Esta es una famosa pregunta de entrevista que se hace en Google , Paytm y muchas otras entrevistas de empresas. 
A continuación se muestra el enunciado del problema.

Imagine you have a special keyboard with the following keys: 
Key 1:  Prints 'A' on screen
Key 2: (Ctrl-A): Select screen
Key 3: (Ctrl-C): Copy selection to buffer
Key 4: (Ctrl-V): Print buffer on screen appending it
                 after what has already been printed. 

If you can only press the keyboard for N times (with the above four
keys), write a program to produce maximum numbers of A's. That is to
say, the input parameter is N (No. of keys that you can press), the 
output is M (No. of As that you can produce).

Ejemplos: 

Input:  N = 3
Output: 3
We can at most get 3 A's on screen by pressing 
following key sequence.
A, A, A

Input:  N = 7
Output: 9
We can at most get 9 A's on screen by pressing 
following key sequence.
A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V

Input:  N = 11
Output: 27
We can at most get 27 A's on screen by pressing 
following key sequence.
A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V, Ctrl A, 
Ctrl C, Ctrl V, Ctrl V

A continuación se presentan algunos puntos importantes a tener en cuenta.
a) Para N < 7, la salida es N misma. 
b) Ctrl V se puede usar varias veces para imprimir el búfer actual (consulte los dos últimos ejemplos anteriores). La idea es calcular la longitud óptima de la string para N pulsaciones de teclas utilizando una idea simple. La secuencia de N pulsaciones de teclas que produce una longitud de string óptima terminará con un sufijo de Ctrl-A, Ctrl-C, seguido solo por Ctrl-V. (Para N > 6)
La tarea es encontrar el punto de interrupción después del cual obtenemos el sufijo de pulsaciones de teclas anterior. La definición de un punto de interrupción es esa instancia después de la cual solo necesitamos presionar Ctrl-A, Ctrl-C una vez y luego solo Ctrl-V para generar la longitud óptima. Si hacemos un bucle de N-3 a 1 y elegimos cada uno de estos valores para el punto de ruptura, y calculamos la string óptima que producirían. Una vez que finaliza el bucle, tendremos el máximo de las longitudes óptimas para varios puntos de interrupción, lo que nos dará la longitud óptima para N pulsaciones de teclas.

A continuación se muestra la implementación basada en la idea anterior.  

C++14

/* A recursive C++ program to print maximum number of A's using
following four keys */
#include <bits/stdc++.h>
using namespace std;
 
// A recursive function that returns the optimal length string
// for N keystrokes
int findoptimal(int N)
{
    // The optimal string length is N when N is smaller than 7
    if (N <= 6)
        return N;
 
    // Initialize result
    int max = 0;
 
    // TRY ALL POSSIBLE BREAK-POINTS
    // For any keystroke N, we need to loop from N-3 keystrokes
    // back to 1 keystroke to find a breakpoint 'b' after which we
    // will have Ctrl-A, Ctrl-C and then only Ctrl-V all the way.
    int b;
    for (b = N - 3; b >= 1; b--) {
 
        // If the breakpoint is s at b'th keystroke then
        // the optimal string would have length
        // (n-b-1)*screen[b-1];
        int curr = (N - b - 1) * findoptimal(b);
        if (curr > max)
            max = curr;
    }
    return max;
}
 
// Driver program
int main()
{
    int N;
 
    // for the rest of the array we will reply on the previous
    // entries to compute new ones
    for (N = 1; N <= 20; N++)
        cout << "Maximum Number of A's with " << N <<
        " keystrokes is " << findoptimal(N) << endl;
}
 
// This code is contributed by shubhamsingh10

C

/* A recursive C program to print maximum number of A's using
   following four keys */
#include <stdio.h>
 
// A recursive function that returns the optimal length string
// for N keystrokes
int findoptimal(int N)
{
    // The optimal string length is N when N is smaller than 7
    if (N <= 6)
        return N;
 
    // Initialize result
    int max = 0;
 
    // TRY ALL POSSIBLE BREAK-POINTS
    // For any keystroke N, we need to loop from N-3 keystrokes
    // back to 1 keystroke to find a breakpoint 'b' after which we
    // will have Ctrl-A, Ctrl-C and then only Ctrl-V all the way.
    int b;
    for (b = N - 3; b >= 1; b--) {
        // If the breakpoint is s at b'th keystroke then
        // the optimal string would have length
        // (n-b-1)*screen[b-1];
        int curr = (N - b - 1) * findoptimal(b);
        if (curr > max)
            max = curr;
    }
    return max;
}
 
// Driver program
int main()
{
    int N;
 
    // for the rest of the array we will reply on the previous
    // entries to compute new ones
    for (N = 1; N <= 20; N++)
        printf("Maximum Number of A's with %d keystrokes is %d\n",
               N, findoptimal(N));
}

Java

/* A recursive Java program to print
  maximum number of A's using
  following four keys */
import java.io.*;
 
class GFG {
 
    // A recursive function that returns
    // the optimal length string  for N keystrokes
    static int findoptimal(int N)
    {
        // The optimal string length is N
        // when N is smaller than 7
        if (N <= 6)
            return N;
 
        // Initialize result
        int max = 0;
 
        // TRY ALL POSSIBLE BREAK-POINTS
        // For any keystroke N, we need to
        // loop from N-3 keystrokes back to
        // 1 keystroke to find a breakpoint
        // 'b' after which we will have Ctrl-A,
        // Ctrl-C and then only Ctrl-V all the way.
        int b;
        for (b = N - 3; b >= 1; b--) {
            // If the breakpoint is s at b'th
            // keystroke then the optimal string
            // would have length
            // (n-b-1)*screen[b-1];
            int curr = (N - b - 1) * findoptimal(b);
            if (curr > max)
                max = curr;
        }
        return max;
    }
 
    // Driver program
    public static void main(String[] args)
    {
        int N;
 
        // for the rest of the array we
        // will reply on the previous
        // entries to compute new ones
        for (N = 1; N <= 20; N++)
            System.out.println("Maximum Number of A's with keystrokes is " + N + findoptimal(N));
    }
}
 
// This code is contributed by vt_m.

Python3

# A recursive Python3 program to print maximum
# number of A's using following four keys
 
# A recursive function that returns
# the optimal length string for N keystrokes
 
def findoptimal(N):
     
    # The optimal string length is
    # N when N is smaller than
    if N<= 6:
        return N
 
    # Initialize result
    maxi = 0
 
    # TRY ALL POSSIBLE BREAK-POINTS
    # For any keystroke N, we need
    # to loop from N-3 keystrokes
    # back to 1 keystroke to find
    # a breakpoint 'b' after which we
    # will have Ctrl-A, Ctrl-C and then
    # only Ctrl-V all the way.
    for b in range(N-3, 0, -1):
        curr =(N-b-1)*findoptimal(b)
        if curr>maxi:
            maxi = curr
     
    return maxi
# Driver program
if __name__=='__main__':
     
 
# for the rest of the array we will
# reply on the previous
# entries to compute new ones
    for n in range(1, 21):
        print('Maximum Number of As with ', n, 'keystrokes is ', findoptimal(n))
        
# this code is contributed by sahilshelangia

C#

/* A recursive C# program
to print maximum number
of A's using following
four keys */
using System;
 
class GFG {
    // A recursive function that
    // returns the optimal length
    // string for N keystrokes
    static int findoptimal(int N)
    {
        // The optimal string length
        // is N when N is smaller than 7
        if (N <= 6)
            return N;
 
        // Initialize result
        int max = 0;
 
        // TRY ALL POSSIBLE BREAK-POINTS
        // For any keystroke N, we need
        // to loop from N-3 keystrokes
        // back to 1 keystroke to find
        // a breakpoint 'b' after which
        // we will have Ctrl-A, Ctrl-C
        // and then only Ctrl-V all the way.
        int b;
        for (b = N - 3; b >= 1; b--) {
            // If the breakpoint is s
            // at b'th keystroke then
            // the optimal string would
            // have length (n-b-1)*screen[b-1];
            int curr = (N - b - 1) * findoptimal(b);
            if (curr > max)
                max = curr;
        }
        return max;
    }
 
    // Driver code
    static void Main()
    {
        int N;
 
        // for the rest of the array
        // we will reply on the
        // previous entries to compute
        // new ones
        for (N = 1; N <= 20; N++)
            Console.WriteLine("Maximum Number of A's with " + N + " keystrokes is " + findoptimal(N));
    }
}
 
// This code is contributed by Sam007

PHP

<?php
/* A recursive PHP program to print maximum number of A's using
following four keys */
 
// A recursive function that returns the optimal
//  length string for N keystrokes
function findoptimal($N)
{
    // The optimal string length is
    // N when N is smaller than 7
    if ($N <= 6)
        return $N;
 
    // Initialize result
    $max = 0;
 
    // TRY ALL POSSIBLE BREAK-POINTS
    // For any keystroke N, we need to loop from N-3 keystrokes
    // back to 1 keystroke to find a breakpoint 'b' after which we
    // will have Ctrl-A, Ctrl-C and then only Ctrl-V all the way.
    $b;
    for ($b = $N - 3; $b >= 1; $b -= 1)
    {
            // If the breakpoint is s at b'th keystroke then
            // the optimal string would have length
            // (n-b-1)*screen[b-1];
            $curr = ($N - $b - 1) * findoptimal($b);
            if ($curr > $max)
                $max = $curr;
    }
    return $max;
}
 
// Driver code
$N;
 
// for the rest of the array we will reply on the previous
// entries to compute new ones
for ($N = 1; $N <= 20; $N += 1)
    echo("Maximum Number of A's with"
        .$N."keystrokes is ".findoptimal($N)."\n");
 
// This code is contributed by aman neekhara
?>

Javascript

<script>
 
// A recursive Javascript program to print
// maximum number of A's using
// following four keys
     
// A recursive function that returns the
// optimal length string  for N keystrokes
function findoptimal(N)
{
     
    // The optimal string length is N
    // when N is smaller than 7
    if (N <= 6)
        return N;
 
    // Initialize result
    let max = 0;
 
    // TRY ALL POSSIBLE BREAK-POINTS
    // For any keystroke N, we need to
    // loop from N-3 keystrokes back to
    // 1 keystroke to find a breakpoint
    // 'b' after which we will have Ctrl-A,
    // Ctrl-C and then only Ctrl-V all the way.
    let b;
     
    for(b = N - 3; b >= 1; b--)
    {
         
        // If the breakpoint is s at b'th
        // keystroke then the optimal string
        // would have length
        // (n-b-1)*screen[b-1];
        let curr = (N - b - 1) * findoptimal(b);
         
        if (curr > max)
            max = curr;
    }
    return max;
}
 
// Driver code
let N;
 
// For the rest of the array we
// will reply on the previous
// entries to compute new ones
for(N = 1; N <= 20; N++)
    document.write("Maximum Number of A's with "+
                   N + " keystrokes is " +
                   findoptimal(N) + "<br>");
 
// This code is contributed by avanitrachhadiya2155
     
</script>

Producción: 

Maximum Number of A's with 1 keystrokes is 1
Maximum Number of A's with 2 keystrokes is 2
Maximum Number of A's with 3 keystrokes is 3
Maximum Number of A's with 4 keystrokes is 4
Maximum Number of A's with 5 keystrokes is 5
Maximum Number of A's with 6 keystrokes is 6
Maximum Number of A's with 7 keystrokes is 9
Maximum Number of A's with 8 keystrokes is 12
Maximum Number of A's with 9 keystrokes is 16
Maximum Number of A's with 10 keystrokes is 20
Maximum Number of A's with 11 keystrokes is 27
Maximum Number of A's with 12 keystrokes is 36
Maximum Number of A's with 13 keystrokes is 48
Maximum Number of A's with 14 keystrokes is 64
Maximum Number of A's with 15 keystrokes is 81
Maximum Number of A's with 16 keystrokes is 108
Maximum Number of A's with 17 keystrokes is 144
Maximum Number of A's with 18 keystrokes is 192
Maximum Number of A's with 19 keystrokes is 256
Maximum Number of A's with 20 keystrokes is 324

La función anterior calcula los mismos subproblemas una y otra vez. Los cálculos de los mismos subproblemas se pueden evitar almacenando las soluciones a los subproblemas y resolviendo los problemas de forma ascendente. 

A continuación se muestra la implementación de C basada en la programación dinámica en la que se utiliza una pantalla de array auxiliar [N] para almacenar el resultado de los subproblemas. 

C++

/* A Dynamic Programming based C program to find maximum number of A's
that can be printed using four keys */
#include <iostream>
using namespace std;
 
 
// this function returns the optimal length string for N keystrokes
int findoptimal(int N)
{
    // The optimal string length is N when N is smaller than 7
    if (N <= 6)
        return N;
 
    // An array to store result of subproblems
    int screen[N];
 
    int b; // To pick a breakpoint
 
    // Initializing the optimal lengths array for until 6 input
    // strokes.
    int n;
    for (n = 1; n <= 6; n++)
        screen[n - 1] = n;
 
    // Solve all subproblems in bottom manner
    for (n = 7; n <= N; n++) {
        // Initialize length of optimal string for n keystrokes
        screen[n - 1] = 0;
 
        // For any keystroke n, we need to loop from n-3 keystrokes
        // back to 1 keystroke to find a breakpoint 'b' after which we
        // will have ctrl-a, ctrl-c and then only ctrl-v all the way.
        for (b = n - 3; b >= 1; b--) {
            // if the breakpoint is at b'th keystroke then
            // the optimal string would have length
            // (n-b-1)*screen[b-1];
            int curr = (n - b - 1) * screen[b - 1];
            if (curr > screen[n - 1])
                screen[n - 1] = curr;
        }
    }
 
    return screen[N - 1];
}
 
// Driver program
int main()
{
    int N;
 
    // for the rest of the array we will reply on the previous
    // entries to compute new ones
    for (N = 1; N <= 20; N++)
        cout << "Maximum Number of A's with "<<N<<" keystrokes is "
        << findoptimal(N) << endl;
}
 
//This is contributed by shubhamsingh10

C

/* A Dynamic Programming based C program to find maximum number of A's
   that can be printed using four keys */
#include <stdio.h>
 
// this function returns the optimal length string for N keystrokes
int findoptimal(int N)
{
    // The optimal string length is N when N is smaller than 7
    if (N <= 6)
        return N;
 
    // An array to store result of subproblems
    int screen[N];
 
    int b; // To pick a breakpoint
 
    // Initializing the optimal lengths array for until 6 input
    // strokes.
    int n;
    for (n = 1; n <= 6; n++)
        screen[n - 1] = n;
 
    // Solve all subproblems in bottom manner
    for (n = 7; n <= N; n++) {
        // Initialize length of optimal string for n keystrokes
        screen[n - 1] = 0;
 
        // For any keystroke n, we need to loop from n-3 keystrokes
        // back to 1 keystroke to find a breakpoint 'b' after which we
        // will have ctrl-a, ctrl-c and then only ctrl-v all the way.
        for (b = n - 3; b >= 1; b--) {
            // if the breakpoint is at b'th keystroke then
            // the optimal string would have length
            // (n-b-1)*screen[b-1];
            int curr = (n - b - 1) * screen[b - 1];
            if (curr > screen[n - 1])
                screen[n - 1] = curr;
        }
    }
 
    return screen[N - 1];
}
 
// Driver program
int main()
{
    int N;
 
    // for the rest of the array we will reply on the previous
    // entries to compute new ones
    for (N = 1; N <= 20; N++)
        printf("Maximum Number of A's with %d keystrokes is %d\n",
               N, findoptimal(N));
}

Java

/* A Dynamic Programming based C
   program to find maximum number
   of A's that can be printed using
   four keys */
import java.io.*;
 
class GFG {
 
    // this function returns the optimal
    // length string for N keystrokes
    static int findoptimal(int N)
    {
        // The optimal string length is N
        // when N is smaller than 7
        if (N <= 6)
            return N;
 
        // An array to store result
        // of subproblems
        int screen[] = new int[N];
 
        int b; // To pick a breakpoint
 
        // Initializing the optimal lengths
        // array for until 6 input strokes
        int n;
        for (n = 1; n <= 6; n++)
            screen[n - 1] = n;
 
        // Solve all subproblems in bottom manner
        for (n = 7; n <= N; n++) {
            // Initialize length of optimal
            // string for n keystrokes
            screen[n - 1] = 0;
 
            // For any keystroke n, we need
            // to loop from n-3 keystrokes
            // back to 1 keystroke to find
            // a breakpoint 'b' after which we
            // will have ctrl-a, ctrl-c and
            // then only ctrl-v all the way.
            for (b = n - 3; b >= 1; b--) {
                // if the breakpoint is
                // at b'th keystroke then
                // the optimal string would
                // have length
                // (n-b-1)*screen[b-1];
                int curr = (n - b - 1) * screen[b - 1];
                if (curr > screen[n - 1])
                    screen[n - 1] = curr;
            }
        }
 
        return screen[N - 1];
    }
 
    // Driver program
    public static void main(String[] args)
    {
        int N;
 
        // for the rest of the array we will reply on the previous
        // entries to compute new ones
        for (N = 1; N <= 20; N++)
            System.out.println("Maximum Number of A's with keystrokes is " + N + findoptimal(N));
    }
}
 
// This article is contributed by vt_m.

Python3

# A Dynamic Programming based Python program
# to find maximum number of A's
# that can be printed using four keys
 
# this function returns the optimal
# length string for N keystrokes
def findoptimal(N):
 
    # The optimal string length is
    # N when N is smaller than 7
    if (N <= 6):
        return N
 
    # An array to store result of
    # subproblems
    screen = [0]*N
 
    # Initializing the optimal lengths
    # array for until 6 input
    # strokes.
     
    for n in range(1, 7):
        screen[n-1] = n
 
    # Solve all subproblems in bottom manner
    for n in range(7, N + 1):
     
        # Initialize length of optimal
        # string for n keystrokes
        screen[n-1] = 0
 
        # For any keystroke n, we need to
        # loop from n-3 keystrokes
        # back to 1 keystroke to find a breakpoint
        # 'b' after which we
        # will have ctrl-a, ctrl-c and then only
        # ctrl-v all the way.
        for b in range(n-3, 0, -1):
         
            # if the breakpoint is at b'th keystroke then
            # the optimal string would have length
            # (n-b-1)*screen[b-1];
            curr = (n-b-1)*screen[b-1]
            if (curr > screen[n-1]):
                screen[n-1] = curr
         
    return screen[N-1]
 
# Driver program
if __name__ == "__main__":
 
    # for the rest of the array we
    # will reply on the previous
    # entries to compute new ones
    for N in range(1, 21):
        print("Maximum Number of A's with ", N, " keystrokes is ",
                findoptimal(N))
 
# this code is contributed by
# ChitraNayal

C#

/* A Dynamic Programming based C#
program to find maximum number
of A's that can be printed using
four keys */
using System;
public class GFG {
 
    // this function returns the optimal
    // length string for N keystrokes
    static int findoptimal(int N)
    {
        // The optimal string length is N
        // when N is smaller than 7
        if (N <= 6)
            return N;
 
        // An array to store result
        // of subproblems
        int[] screen = new int[N];
 
        int b; // To pick a breakpoint
 
        // Initializing the optimal lengths
        // array for until 6 input strokes
        int n;
        for (n = 1; n <= 6; n++)
            screen[n - 1] = n;
 
        // Solve all subproblems in bottom manner
        for (n = 7; n <= N; n++) {
            // Initialize length of optimal
            // string for n keystrokes
            screen[n - 1] = 0;
 
            // For any keystroke n, we need
            // to loop from n-3 keystrokes
            // back to 1 keystroke to find
            // a breakpoint 'b' after which we
            // will have ctrl-a, ctrl-c and
            // then only ctrl-v all the way.
            for (b = n - 3; b >= 1; b--) {
                // if the breakpoint is
                // at b'th keystroke then
                // the optimal string would
                // have length
                // (n-b-1)*screen[b-1];
                int curr = (n - b - 1) * screen[b - 1];
                if (curr > screen[n - 1])
                    screen[n - 1] = curr;
            }
        }
 
        return screen[N - 1];
    }
 
    // Driver program
    public static void Main(String[] args)
    {
        int N;
 
        // for the rest of the array we will reply on the previous
        // entries to compute new ones
        for (N = 1; N <= 20; N++)
            Console.WriteLine("Maximum Number of A's with {0} keystrokes is {1}\n",
                              N, findoptimal(N));
    }
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
 
// A Dynamic Programming based javascript
// program to find maximum number
// of A's that can be printed using
// four keys
 
// This function returns the optimal
// length string for N keystrokes  
function findoptimal(N)
{
     
    // The optimal string length is N
    // when N is smaller than 7
    if (N <= 6)
        return N;
 
    // An array to store result
    // of subproblems
    let screen = new Array(N);
    for(let i = 0; i < N; i++)
    {
        screen[i] = 0;
    }
     
    // To pick a breakpoint
    let b;
 
    // Initializing the optimal lengths
    // array for until 6 input strokes
    let n;
    for(n = 1; n <= 6; n++)
        screen[n - 1] = n;
 
    // Solve all subproblems in bottom manner
    for(n = 7; n <= N; n++)
    {
         
        // Initialize length of optimal
        // string for n keystrokes
        screen[n - 1] = 0;
 
        // For any keystroke n, we need
        // to loop from n-3 keystrokes
        // back to 1 keystroke to find
        // a breakpoint 'b' after which we
        // will have ctrl-a, ctrl-c and
        // then only ctrl-v all the way.
        for(b = n - 3; b >= 1; b--)
        {
             
            // If the breakpoint is
            // at b'th keystroke then
            // the optimal string would
            // have length
            // (n-b-1)*screen[b-1];
            let curr = (n - b - 1) * screen[b - 1];
             
            if (curr > screen[n - 1])
                screen[n - 1] = curr;
        }
    }
    return screen[N - 1];
}
 
// Driver code
let N;
for(N = 1; N <= 20; N++)
    document.write("Maximum Number of A's with " +
                   N + " keystrokes is " +
                   findoptimal(N) + "<br>");
 
// This code is contributed by rag2127
 
</script>

Producción: 

Maximum Number of A's with 1 keystrokes is 1
Maximum Number of A's with 2 keystrokes is 2
Maximum Number of A's with 3 keystrokes is 3
Maximum Number of A's with 4 keystrokes is 4
Maximum Number of A's with 5 keystrokes is 5
Maximum Number of A's with 6 keystrokes is 6
Maximum Number of A's with 7 keystrokes is 9
Maximum Number of A's with 8 keystrokes is 12
Maximum Number of A's with 9 keystrokes is 16
Maximum Number of A's with 10 keystrokes is 20
Maximum Number of A's with 11 keystrokes is 27
Maximum Number of A's with 12 keystrokes is 36
Maximum Number of A's with 13 keystrokes is 48
Maximum Number of A's with 14 keystrokes is 64
Maximum Number of A's with 15 keystrokes is 81
Maximum Number of A's with 16 keystrokes is 108
Maximum Number of A's with 17 keystrokes is 144
Maximum Number of A's with 18 keystrokes is 192
Maximum Number of A's with 19 keystrokes is 256
Maximum Number of A's with 20 keystrokes is 324

Gracias a Gaurav Saxena por proporcionar el enfoque anterior para resolver este problema.
A medida que aumenta el número de A, el efecto de presionar Ctrl-V más de 3 veces comienza a ser insustancial en comparación con presionar Ctrl-A, Ctrl-C y Ctrl-V nuevamente. Por lo tanto, el código anterior se puede hacer más eficiente al verificar el efecto de presionar Ctrl-V solo 1, 2 y 3 veces.

C++

// A Dynamic Programming based C++ program to find maximum
// number of A's that can be printed using four keys
 
#include <bits/stdc++.h>
using namespace std;
 
// This function returns the optimal length string for N keystrokes
int findoptimal(int N)
{
    // The optimal string length is N when N is smaller than 7
    if (N <= 6)
        return N;
 
    // An array to store result of subproblems
    int screen[N];
 
    int b; // To pick a breakpoint
 
    // Initializing the optimal lengths array for until 6 input
    // strokes.
    int n;
    for (n = 1; n <= 6; n++)
        screen[n - 1] = n;
 
    // Solve all subproblems in bottom-up manner
    for (n = 7; n <= N; n++) {
 
        // for any keystroke n, we will need to choose between:-
        // 1. pressing Ctrl-V once after copying the
        // A's obtained by n-3 keystrokes.
 
        // 2. pressing Ctrl-V twice after copying the A's
        // obtained by n-4 keystrokes.
 
        // 3. pressing Ctrl-V thrice after copying the A's
        // obtained by n-5 keystrokes.
        screen[n - 1] = max(2 * screen[n - 4],
                            max(3 * screen[n - 5],
4 * screen[n - 6]));
    }
 
    return screen[N - 1];
}
 
// Driver program
int main()
{
    int N;
 
    // for the rest of the array we will reply on the previous
    // entries to compute new ones
    for (N = 1; N <= 20; N++)
        printf("Maximum Number of A's with %d keystrokes is %d\n",
               N, findoptimal(N));
}

Java

// A Dynamic Programming based Java program
// to find maximum number of A's that
// can be printed using four keys
class GFG
{
 
// This function returns the optimal length
// string for N keystrokes
static int findoptimal(int N)
{
    // The optimal string length is N
    // when N is smaller than 7
    if (N <= 6)
        return N;
 
    // An array to store result of subproblems
    int []screen = new int[N];
 
    int b; // To pick a breakpoint
 
    // Initializing the optimal lengths array
    // for uptil 6 input strokes.
    int n;
    for (n = 1; n <= 6; n++)
        screen[n - 1] = n;
 
    // Solve all subproblems in bottom-up manner
    for (n = 7; n <= N; n++)
    {
 
        // for any keystroke n, we will need to choose between:-
        // 1. pressing Ctrl-V once after copying the
        // A's obtained by n-3 keystrokes.
 
        // 2. pressing Ctrl-V twice after copying the A's
        // obtained by n-4 keystrokes.
 
        // 3. pressing Ctrl-V thrice after copying the A's
        // obtained by n-5 keystrokes.
        screen[n - 1] = Math.max(2 * screen[n - 4],
                        Math.max(3 * screen[n - 5],
                                 4 * screen[n - 6]));
    }
    return screen[N - 1];
}
 
// Driver Code
public static void main(String[] args)
{
    int N;
 
    // for the rest of the array we will reply
    // on the previous entries to compute new ones
    for (N = 1; N <= 20; N++)
        System.out.printf("Maximum Number of A's with" +
                               " %d keystrokes is %d\n",
                                     N, findoptimal(N));
    }
}
 
// This code is contributed by Princi Singh

Python3

# A Dynamic Programming based Python3 program
# to find maximum number of A's
# that can be printed using four keys
 
# this function returns the optimal
# length string for N keystrokes
def findoptimal(N):
 
    # The optimal string length is
    # N when N is smaller than 7
    if (N <= 6):
        return N
 
    # An array to store result of
    # subproblems
    screen = [0] * N
 
    # Initializing the optimal lengths
    # array for until 6 input
    # strokes.
     
    for n in range(1, 7):
        screen[n - 1] = n
 
    # Solve all subproblems in bottom manner
    for n in range(7, N + 1):
         
        # for any keystroke n, we will need to choose between:-
        # 1. pressing Ctrl-V once after copying the
        # A's obtained by n-3 keystrokes.
 
        # 2. pressing Ctrl-V twice after copying the A's
        # obtained by n-4 keystrokes.
 
        # 3. pressing Ctrl-V thrice after copying the A's
        # obtained by n-5 keystrokes.
        screen[n - 1] = max(2 * screen[n - 4],
                        max(3 * screen[n - 5],
                            4 * screen[n - 6]));
         
    return screen[N - 1]
 
# Driver Code
if __name__ == "__main__":
 
    # for the rest of the array we
    # will reply on the previous
    # entries to compute new ones
    for N in range(1, 21):
        print("Maximum Number of A's with ", N,
              " keystrokes is ", findoptimal(N))
 
# This code is contributed by ashutosh450

C#

// A Dynamic Programming based C# program
// to find maximum number of A's that
// can be printed using four keys
using System;
 
class GFG
{
 
// This function returns the optimal length
// string for N keystrokes
static int findoptimal(int N)
{
    // The optimal string length is N
    // when N is smaller than 7
    if (N <= 6)
        return N;
 
    // An array to store result of subproblems
    int []screen = new int[N];
 
    // Initializing the optimal lengths array
    // for uptil 6 input strokes.
    int n;
    for (n = 1; n <= 6; n++)
        screen[n - 1] = n;
 
    // Solve all subproblems in bottom-up manner
    for (n = 7; n <= N; n++)
    {
 
        // for any keystroke n, we will need to choose between:-
        // 1. pressing Ctrl-V once after copying the
        // A's obtained by n-3 keystrokes.
 
        // 2. pressing Ctrl-V twice after copying the A's
        // obtained by n-4 keystrokes.
 
        // 3. pressing Ctrl-V thrice after copying the A's
        // obtained by n-5 keystrokes.
        screen[n - 1] = Math.Max(2 * screen[n - 4],
                        Math.Max(3 * screen[n - 5],
                                4 * screen[n - 6]));
    }
    return screen[N - 1];
}
 
// Driver Code
public static void Main(String[] args)
{
    int N;
 
    // for the rest of the array we will reply
    // on the previous entries to compute new ones
    for (N = 1; N <= 20; N++)
        Console.Write("Maximum Number of A's with" +
                            " {0} keystrokes is {1}\n",
                                    N, findoptimal(N));
    }
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
 
// A Dynamic Programming based
// JavaScript program to find maximum
// number of A's that can be printed
// using four keys
 
// This function returns the optimal
// length string for N keystrokes
function findoptimal(N){
    // The optimal string length is N
    // when N is smaller than 7
    if (N <= 6)
        return N;
 
    // An array to store result
    // of subproblems
    let screen = [];
 
    let b; // To pick a breakpoint
 
    // Initializing the optimal lengths
    // array for until 6 input
    // strokes.
    let n;
    for (n = 1; n <= 6; n++)
        screen[n - 1] = n;
 
    // Solve all subproblems in bottom-up manner
    for (n = 7; n <= N; n++) {
 
        // for any keystroke n, we will
        // need to choose between:-
        // 1. pressing Ctrl-V once
        // after copying the
        // A's obtained by n-3 keystrokes.
 
        // 2. pressing Ctrl-V twice after
        // copying the A's
        // obtained by n-4 keystrokes.
 
        // 3. pressing Ctrl-V thrice
        // after copying the A's
        // obtained by n-5 keystrokes.
        screen[n - 1] = Math.max(2 * screen[n - 4],
                        Math.max(3 * screen[n - 5],
4 * screen[n - 6]));
    }
 
    return screen[N - 1];
}
 
// Driver program
let N;
// for the rest of the array we will reply on the previous
// entries to compute new ones
for (N = 1; N <= 20; N++)
    document.write(
    "Maximum Number of A's with "+ N +" keystrokes is "
    +findoptimal(N)+"<br>"
    );
 
</script>

Producción: 

Maximum Number of A's with 1 keystrokes is 1
Maximum Number of A's with 2 keystrokes is 2
Maximum Number of A's with 3 keystrokes is 3
Maximum Number of A's with 4 keystrokes is 4
Maximum Number of A's with 5 keystrokes is 5
Maximum Number of A's with 6 keystrokes is 6
Maximum Number of A's with 7 keystrokes is 9
Maximum Number of A's with 8 keystrokes is 12
Maximum Number of A's with 9 keystrokes is 16
Maximum Number of A's with 10 keystrokes is 20
Maximum Number of A's with 11 keystrokes is 27
Maximum Number of A's with 12 keystrokes is 36
Maximum Number of A's with 13 keystrokes is 48
Maximum Number of A's with 14 keystrokes is 64
Maximum Number of A's with 15 keystrokes is 81
Maximum Number of A's with 16 keystrokes is 108
Maximum Number of A's with 17 keystrokes is 144
Maximum Number of A's with 18 keystrokes is 192
Maximum Number of A's with 19 keystrokes is 256
Maximum Number of A's with 20 keystrokes is 324

Gracias a Sahil por proporcionar el enfoque anterior para resolver este problema.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

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