Méthode de résolution de problèmes de LeetCode de programmation dynamique et exercices associés (1)

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

  1. Décomposer les gros problèmes en petits
  2. 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
Insérez la description de l'image ici
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)

Insérez la description de l'image ici


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)

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43283397/article/details/108264137
conseillé
Classement