Debe encontrar para un número determinado de pulsaciones de teclas (N) el número máximo de caracteres ‘A’ que puede generar. Solo puede usar 4 teclas: A, Ctrl + A, Ctrl + C y Ctrl + V. Solo se permiten N pulsaciones de teclas. ¿Puedes escribir este programa?

Esto se puede resolver mediante el uso de programación dinámica. Aquí está el algoritmo:

1. Para N <7, la salida es N misma.
2. Para producir el número máximo de A, la secuencia de N pulsaciones de teclas que se utilizarán terminará con un sufijo de Ctrl-A, Ctrl-C, seguido de solo Ctrl-V (para N> 6).
3. La tarea es encontrar el punto crítico después del cual obtenemos el sufijo anterior de las pulsaciones de teclas.
4. Un punto crítico es esa instancia después de la cual solo debemos presionar Ctrl-A, Ctrl-C una vez y las únicas Ctrl-V después para generar el número máximo de A.
5. Realizamos un bucle de N-3 a 1 y elegimos cada uno de estos valores para el punto crítico, y calculamos esa cadena óptima que producirían. Al calcular el número óptimo de As para cada punto crítico, utilizamos el número óptimo de As ya calculado para el número de pulsaciones de teclas <N.
6. Una vez que finalice el bucle anterior, tendremos el máximo de las longitudes óptimas para varios puntos críticos, dándonos así la longitud óptima para N pulsaciones de teclas.

Fuente: para imprimir el número máximo de As utilizando las cuatro teclas dadas.
Puede ver este video para obtener una explicación detallada de la solución con prueba de corrección.

Puedo pensar en un enfoque dinámico basado en la programación, aunque podría haber mejores soluciones.

L (i, j, k) es el máximo no. de A que puede generar cuando ya tiene ‘i’ A en la secuencia, ‘j’ A en la memoria (copiada y almacenada en el portapapeles) y ‘k’ se mueve hacia la izquierda.

La recurrencia se obtiene como:
L (i, j, k) = max {A presionado, Ctrl + A Ctrl + C Ctrl + V presionado, Ctrl + V presionado}
(Tenga en cuenta que Ctrl + A siempre irá seguido de Ctrl + C y Ctrl + V para obtener una respuesta óptima).

= max {L (i + 1, j, k-1), L (2 * i, i, k-3), L (i + j, j, k-1)}

Necesitas encontrar L (0, 0, n).

  • Para las entradas N = 1 a N = 6 , el máximo es N en sí. Podemos usar esta información para poner un caso base en nuestra solución.
  • Para todos los demás valores de N, debemos comenzar nuestra búsqueda desde N-3 hasta 1 y probar todas las combinaciones posibles.

Esto lleva a la siguiente relación de recurrencia:

F (N) = MAX (F (j) * (N – j -1)) donde N-3 <= j <= 1

Luego podemos resolverlo usando la Programación dinámica con el uso de una matriz adicional que almacenará el valor máximo para un subproblema una vez que se resuelva. Más adelante, cuando volvamos a resolver el mismo problema nuevamente, reutilizaremos este valor nuevamente para intentar evaluarlo desde cero. Esto ocupa O (n) espacio extra, pero reduce el tiempo de ejecución a O (n ^ 2) .

Sin embargo, este problema también se puede resolver en la complejidad del tiempo O (n) : consulte el artículo detallado aquí: Programación dinámica: número máximo de A utilizando las teclas Ctrl-A, Ctrl-C, Ctrl-V (pregunta de la entrevista de Google)

Esta no es una respuesta seria, pero pensé que debería seguir adelante de todos modos. Lo que puede hacer es presionar A, mantenerlo presionado hasta que tenga n-3 A. Luego puede usar Ctrl + A, Ctrl + C, Ctrl + V.

More Interesting

No estoy interesado en los cursos de cálculo y matemáticas, ¿CS CS es la opción correcta?

¿Qué tan probable es que las computadoras alienígenas se basen en algo equivalente a un UTM?

Coloque números de cinco bits en los vértices de un hipercubo de 9 dimensiones de modo que, desde cualquier vértice, pueda alcanzar cualquier número en no más de dos movimientos a lo largo de los bordes del hipercubo.

¿Cuáles son algunos problemas simplemente en teoría de grafos o combinatoria para estudiantes universitarios?

¿Cómo se usa el teorema de Bayes en robótica?

¿Cuál es una forma intuitiva de entender la solución de programación dinámica ascendente al problema de partición para matrices?

¿Cuáles son los cursos / libros matemáticos útiles para SRM de TopCoder?

Si tengo un número (ej .: n = 28), ¿existe una fórmula cerrada para saber cuántos son los pares ordenados de números enteros (a, b) de manera que [matemáticas] a \ cdot b = n [/ matemáticas]?

¿Cuál es la utilidad de gomutra?

Cómo resolver problemas sobre el análisis de algoritmos paso a paso

¿Debo leer matemáticas y algoritmos discretos primero antes de comenzar la programación competitiva?

¿Cómo es tomar CS 151 (teoría de la complejidad) en Caltech?

¿Podrán los robots hacer pruebas matemáticas e investigar todas las leyes físicas del universo mejor que los humanos?

¿Es Java crucial para comprender completamente la POO?

¿Cuál es el significado y el beneficio de las variables compartidas en Theano?