Suma de camino máxima de triángulo de números -- python campo con programming-challenge camp codereview Relacionados El problema

Maximum path sum of triangle of numbers


4
vote

problema

Español

He implementado la suma máxima de camino de un triángulo de enteros (Problema 18 en Project Euler) y me pregunto cómo puedo mejorar mi solución. Mi solución está abajo:

  def problem18(triangle, height):     return dp_triangle(triangle, height, 0, 0, dict())  def dp_triangle(triangle, height, row, col, maxs):     if row == height - 1:         return int(triangle[row][col])      keyLeft = str(row + 1) + "," + str(col)     keyRight = str(row + 1) + "," + str(col + 1)      if keyLeft in maxs:         maxLeft = maxs[keyLeft]     else:         maxLeft = dp_triangle(triangle, height, row + 1, col, maxs)         maxs[keyLeft] = maxLeft      if keyRight in maxs:         maxRight = maxs[keyRight]     else:         maxRight = dp_triangle(triangle, height, row + 1, col + 1, maxs)         maxs[keyRight] = maxRight      return max(maxLeft, maxRight) + int(triangle[row][col])   

Para llamar a esta función, tengo lo siguiente:

  def main(argv):     with open(argv[1], 'r') as f:         triangle = f.readlines()      height = len(triangle)      triangle = [x.strip().split() for x in triangle]      print(problem18(triangle, height))   

Acabo de pasar un archivo de texto con el triángulo de números al programa. Estos números están separados por espacios en blanco.

Original en ingles

I have implemented the maximum path sum of a triangle of integers (problem 18 in project euler) and I am wondering how I can improve my solution. My solution is below:

def problem18(triangle, height):     return dp_triangle(triangle, height, 0, 0, dict())  def dp_triangle(triangle, height, row, col, maxs):     if row == height - 1:         return int(triangle[row][col])      keyLeft = str(row + 1) + "," + str(col)     keyRight = str(row + 1) + "," + str(col + 1)      if keyLeft in maxs:         maxLeft = maxs[keyLeft]     else:         maxLeft = dp_triangle(triangle, height, row + 1, col, maxs)         maxs[keyLeft] = maxLeft      if keyRight in maxs:         maxRight = maxs[keyRight]     else:         maxRight = dp_triangle(triangle, height, row + 1, col + 1, maxs)         maxs[keyRight] = maxRight      return max(maxLeft, maxRight) + int(triangle[row][col]) 

To call this function I have the following:

def main(argv):     with open(argv[1], 'r') as f:         triangle = f.readlines()      height = len(triangle)      triangle = [x.strip().split() for x in triangle]      print(problem18(triangle, height)) 

I just pass a text file with the triangle of numbers to the program. These numbers are separated by whitespace.

     
     
     

Lista de respuestas

2
 
vote

LOAD_FACTOR7 depende de tres cosas: LOAD_FACTOR8 , LOAD_FACTOR9 y memset(new_mem + to->cap, 0, to->cap); 020 . Por lo tanto, no es necesario almacenar en caché más de una fila a la vez. Con esa idea, debe poder refactorizarlo para no necesitar memset(new_mem + to->cap, 0, to->cap); 1 en absoluto.

En realidad prefiero resolver este problema bajando en lugar de arriba. Es decir, definí mi resultado intermedio como memset(new_mem + to->cap, 0, to->cap); 2 . Luego, la matriz doble de memset(new_mem + to->cap, 0, to->cap); 3 se puede procesar en orden utilizando un bucle simple 99887766655443324 99887766555443325 ligeramente complicado bucle.

 

dp_triangle(triangle, height, row, col) depends on three things: dp_triangle(triangle, height, row + 1, col), dp_triangle(triangle, height, row + 1, col + 1), and triangle[row][col]. Therefore it's not necessary to cache more than one row at a time. With that insight you should be able to refactor it to not need dict() at all.

I actually prefer to solve this problem by going down rather than up. That is to say, I define my intermediate result as v(row, col) = max(v(row-1, col-1), v(row-1, col)) + triangle[row][col]. Then the double-array of triangle can be processed in order using a simple for loop, as opposed to in reverse using a slightly more complicated for loop.

 
 

Relacionados problema

6  Proyecto EULER # 7: 10001ST PRIME  ( Project euler 7 10001st prime ) 
Esta es mi implementación de Project Euler # 7 . ¿Lo he exagerado de nuevo? ¿Hay algo más que debería o no debo hacer? Se ejecuta en 9 milisegundos en mi com...

6  Solución de codewars a "ascensor simple"  ( Codewars solution to simple elevator ) 
Soy nuevo en la programación (menos de un año), y me gustaría mejorar. Resolví un problema en las claquinas y copié tanto mi solución como la solución venci...

1  Codificación de Google Jam: Tienda Credit Java Solution  ( Google code jam store credit java solution ) 
Sería genial si pudiera obtener este código revisado. Me encantaría consejos sobre cómo podría mejorar mi código. problema Recibirá un crédito C en una...

4  Encuentre el número de subcadenas de una cadena numérica mayor que una cadena numérica dada  ( Find the number of substrings of a numerical string greater than a given num str ) 
Pregunta: http://qa.geeksforgeeks.org/9744/vinay-queried-interesting -Problem-optimización Entrada La primera línea contiene n que denota la longitud...

5  Cuatro cuatro para obtener cualquier número  ( Four fours to get any number ) 
Decidí resolver un problema de Código Golf llamado los cuatro cuatro . Descripción del problema: El Puzzle Four Fours es un popular rompecabezas matemát...

5  Proyecto EULER NO. 17: contando letras para escribir los números de 1 a 1000  ( Project euler no 17 counting letters to write the numbers from 1 to 1000 ) 
Soy muy nuevo en la programación y, cierto, estoy avergonzado de compartir mi código para la crítica. Este código funciona y produce la respuesta correcta a l...

6  Las vocales en una cadena están en orden alfabético  ( Vowels in a string are in alphabetical order ) 
Tarea Escriba una implementación que devuelva si un 99887776655544330 tiene vocales (idioma inglés) en orden alfabético (A-Z) o no. Feedback es mi v...

6  Encontrar el siguiente palíndromo de una cadena de números  ( Finding the next palindrome of a number string ) 
Aquí está el problema: Un entero positivo se llama palíndromo si su representación en el El sistema decimal es el mismo cuando se lee de izquierda a dere...

61  Uso de funciones separadas para Project Euler 1  ( Using separate functions for project euler 1 ) 
Comencé a programar con Java y C ++, así que estoy acostumbrado a tener una función "principal" que llama a otras funciones que realizan el trabajo real. En l...

56  Proyecto Euler Problema 1 en Python - Múltiples de 3 y 5  ( Project euler problem 1 in python multiples of 3 and 5 ) 
Me gustaría sugerencias para optimizar esta solución de fuerza bruta a problema 1 . El algoritmo actualmente comprueba cada entero entre 3 y 1000. Me gustarí...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos