Dada una expresión matemática 2 + 4 * 6 + 8-11, ¿cómo la colocaría entre corchetes de manera que proporcione el valor máximo? ¿Es posible codificar esto?

Sí, es posible y bastante simple.

Solución ineficiente simple: retroceso

Sin embargo, ese no es el mejor enfoque, por lo que debemos pensar en algo más inteligente.

Lo primero que debe notar es que no importa cómo coloque los corchetes, no puede separar las multiplicaciones. De hecho, lo único que podría suceder después de poner la parálisis en tal expresión es agregar los números que tienen los operadores +/- a estas multiplicaciones.

Si usted tiene

X * X * X + X + X + X

Querrás que se agreguen las 3 X a uno de los factores de la multiplicación

X * X * (X + X + X + X)

Otro ejemplo:

X * X * X + X + X-X + X * X * X + X + X + X

Se convierte en:

X * X * (X + X + X + X + X) * X * (X + X + X + X)

Entonces, en el caso de que solo hubiera ‘*’ y ‘+’, todo lo que teníamos que hacer era unificar la expresión en una gran cadena de multiplicación.

En el caso de que también tengamos menos, debemos verificar si dejar números negativos fuera de nuestra cadena sería mejor que el enfoque original o viceversa.

Por ejemplo:

X * X * X + X + X-X + X * X * X + X + X + X

La solución podría ser cualquiera de los dos dependiendo de los valores:

X * X * (X + X + X-X + X) * X * (X + X + X + X)

X * X * (X + X + X) -X + (X) * X * (X + X + X + X)

El valor máximo se logra mediante

((2 + 4) * (6 + 8)) – 11 = 73

La regla es que hagas * antes de + o -. y hace los corchetes de adentro hacia afuera antes de que se apliquen otros operadores.

Sin corchetes se hará así (El * primero)

2 + (4 * 6) + 8-11 = 23

Al escribir software con expresiones complejas, es una buena práctica poner entre paréntesis la forma en que desea que se haga. Hace que la expresión sea más fácil de leer.

Para maximizar los valores para esto es (2 + 4) * (6 + 8) -11 = 73

Para codificarlo, deberá decidir cuáles son las reglas:

Creo que sería algo así como:

Sumas de grupo (pero no restas) que están alrededor de una multiplicación.

Si necesita dividir también, probablemente desee una regla diferente:

Agrupar adiciones a la izquierda de una división y restas a la derecha.

No estoy seguro de lo que haría para los exponentes, pero probablemente también agregue grupos para ambos lados de eso.

Sin embargo, probablemente habrá excepciones de casos especiales a cualquier regla.

More Interesting

Cómo reconocer un problema como un problema de programación dinámica

Cómo escribir un programa ruby ​​para mostrar los números de Armstrong en una matriz (siendo la matriz; Números = [123,124,153,370,234,23,45]

Un profesor me dijo que no me molestara en aprender muchos lenguajes de programación sino que me enfocara solo en C ++, estructuras de datos y algoritmos, ¿tiene razón?

¿Qué tipo de algoritmos de visión por computadora se utilizan en los robots industriales?

¿Cuál es el mejor algoritmo de clasificación para matrices aproximadamente ordenadas?

¿Es razonable delegar decisiones importantes sobre algoritmos?

¿Cuál es mejor, búsqueda binaria o búsqueda lineal?

CodeChef: ¿Está bien resolver los desafíos de programación sin el conocimiento de algoritmos?

¿Cómo resolver el problema de corchetes en SPOJ (SPOJ: SQRBR)?

¿Cuáles son algunos algoritmos inesperados que se usan en física y ciencia de materiales?

Si un algoritmo se ejecuta en tiempo O (N), pero N no excede una constante, ¿puedo decir que el algoritmo se ejecuta en tiempo constante?

¿Cuál es la diferencia entre analizar un archivo CSV y JSON? ¿Qué algoritmos comunes usarías en ambos?

¿Qué otros algoritmos de clasificación utilizan la estrategia 'Divide y vencerás' además de la clasificación rápida y la combinación?

¿Cómo ayuda la selección de estructuras de datos apropiadas para diseñar mejores algoritmos?

Cómo declarar un conjunto de cadenas de tamaño desconocido para obtenerlo del usuario sin usar la función de asignación en C