Método de resolução de problemas de programação dinâmica e exercícios relacionados do LeetCode (1)

Nota: Não procure o significado literal, use o nome de programação dinâmica para reverter o algoritmo! Na verdade, a programação dinâmica é mais como uma versão atualizada das questões da série do ensino médio.


Dois pontos que precisam ser atendidos para problemas que podem ser resolvidos por programação dinâmica

  1. Divida os grandes problemas em pequenos
  2. Pequenos problemas são chamados repetidamente

Aplicar programação dinâmica dividida em programação dinâmica em três sub-objetivos

1. Estabeleça a equação de transição de estado:

Um pensamento: saiba o valor de f (1) ~ f (n-1) e, em seguida, encontre uma maneira de usá-los para encontrar f (n)

2. Armazene em cache e reutilize resultados anteriores

Sem o processamento adequado, a complexidade do tempo provavelmente será exponencial

3. Calcule em ordem de pequeno a grande


exemplo:

1. Sequência de Fibonacci (simples)

Sequência de Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 ...
Segue esta regra: o valor atual é a soma dos dois valores anteriores. Então, qual é o enésimo valor?

Primeiro, podemos facilmente obter a equação de transição de estado: f (n) = f (n - 1) + f (n - 2), n> = 2 f (n) = f (n-1) + f (n- 2), n> = 2f ( n )=f ( n-1 )+f ( n-2 ) ,n>=2

1. Recursão simples (contra-exemplo):

def fib(n):
	if n < 2:
		return n
	else:
		return fib(n-1) + fib(n-2)
		
print(fib(100))

Nível de índice de complexidade de tempo, o mesmo que nenhum efeito de gravação
Insira a descrição da imagem aqui
2. Programação dinâmica

def fib(n):
    result = list(range(n+1)) # 缓存以往的结果,方便复用(目标2)
    
    for i in range(n+1):      # 按顺序从小往大算(目标3)
        if i < 2:
            result[i] = i
        else:
            # 使用状态转移方程(目标1),同时复用以往结果(目标2)
            result[i] = result[i-1] + result[i-2] 
    
    return result[-1]

if __name__ == "__main__":
    result = fib(100)
    print(result)

Insira a descrição da imagem aqui


2. Caminhos diferentes (dificuldade)

Rich LeetCode - 62. Caminhos diferentes

class Solution():
    def uniquePaths(self, m, n):   # 将二维列表初始化为1,以便之后用于缓存(目标2)
        dp = [[1]*n]*m

        for i in range(1, m):      # 外循环逐行计算(目标3)
            for j in range(1, n):  # 内循环逐行计算(目标3)
                dp[i][j] = dp[i][j-1] + dp[i-1][j]  # 状态方程(目标1),以及中间结果复用(目标2)

        return dp[m-1][n-1]

s = Solution()
m = 3
n = 2
print(s.uniquePaths(m, n))

Artigos de sublimação:

Método de resolução de problemas de programação dinâmica e exercícios relacionados do LeetCode (2)

Acho que você gosta

Origin blog.csdn.net/weixin_43283397/article/details/108264137
Recomendado
Clasificación