Leetcode brushing record-120. Suma de trayectoria mínima triangular

Inserte la descripción de la imagen aquí

Este problema es muy complicado.
Si considera la dirección de arriba hacia abajo, debido a que la horquilla solo puede corregir los dos números debajo y a la derecha, la
horquilla final solo puede caer en una horquilla parcial redonda, lo que puede conducir a que no se encuentren algunos puntos ocultos. .
Como:
1 000
999 998
997 996 995
. 1 994 993 992

Si considera el óptimo global, considere el método de programación dinámica ascendente.
Sin considerar primero el problema complejo completo, tratamos de encontrar la relación de un triángulo local.
Para un triángulo con solo tres elementos,
A
BC.
Si DP (x, y) se define como la suma mínima de las posiciones (x, y), ingrese el triángulo bidimensional Si la matriz es a, la
resolvemos en la dirección ascendente,
entonces DP (0,0) = min (DP (1,0), DP (1,1)) + a [0] [0]
porque podemos determinar : ¡El resultado de la posición [I] [J] solo está relacionado con el número debajo y el número en la esquina inferior derecha! !

class Solution:
    def __init__(self):
        self.tl = []
        self.length = 0
        self.tdict = {}
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        self.tl = triangle
        self.length = len(triangle)
        if len(triangle) == 1:
            return triangle[0][0]
        else:
            return self.dp(0,0)
    def dp(self,x,y):
        if x == self.length - 1:
            return self.tl[-1][y]
        elif str(x) + '_' + str(y) in self.tdict:
            return self.tdict[str(x) + '_' + str(y)]
        else:
            res = min(self.dp(x+1,y),self.dp(x+1,y+1)) + self.tl[x][y]
            self.tdict[str(x) + '_' + str(y)] = res
            return res

Simplifique el código anterior para obtener

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        length = len(triangle)
        for i in range(length - 1,0,-1):
            for j in range(i):
                triangle[i-1][j] += min(triangle[i][j], triangle[i][j + 1])
        return triangle[0][0] 
Publicado 43 artículos originales · elogiado 14 · 20,000+ visitas

Supongo que te gusta

Origin blog.csdn.net/weixin_41545780/article/details/105101180
Recomendado
Clasificación