Remarque: ne cherchez pas de signification littérale, utilisez le nom de programmation dynamique pour inverser l'algorithme! En fait, la programmation dynamique ressemble plus à une version améliorée des questions de la série du secondaire.
Deux points à respecter pour les problèmes qui peuvent être résolus par la programmation dynamique
- Décomposer les gros problèmes en petits
- Les problèmes mineurs sont appelés à plusieurs reprises
Appliquer la programmation dynamique à programmation dynamique en trois sous-objectifs
1. Établissez l'équation de transition d'état:
Une pensée: connaître la valeur de f (1) ~ f (n-1), puis trouver un moyen de les utiliser pour trouver f (n)
2. Mettre en cache et réutiliser les résultats antérieurs
Sans traitement approprié, la complexité temporelle est susceptible d'être exponentielle
3. Calculez dans l'ordre de petit à grand
exemple:
1. Séquence de Fibonacci (simple)
Séquence de Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233 ...
On suit cette règle: la valeur courante est la somme des deux valeurs précédentes. Alors, quelle est la nième valeur?
Premièrement, nous pouvons facilement obtenir l'équation de transition d'état: 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. Récursivité simple (contre-exemple):
def fib(n):
if n < 2:
return n
else:
return fib(n-1) + fib(n-2)
print(fib(100))
Niveau d'indice de complexité temporelle, identique à l'absence d'effet d'écriture
2. Programmation dynamique
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. Différents chemins (difficulté)
Rich LeetCode - 62. Différents chemins
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))
Articles de sublimation:
Méthode de résolution de problèmes de LeetCode de programmation dynamique et exercices associés (2)