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
- Divida os grandes problemas em pequenos
- 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
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)
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)