Une compréhension de l'idée de la programmation dynamique

Une compréhension de l'idée de la programmation dynamique

I. Aperçu

Le cœur de la programmation dynamique est l'équation de transition dynamique. La signification de cette équation de transition dynamique est que l'état actuel est lié à l'état précédent. En d'autres termes, l'état actuel est lié à l'état précédent, ou l'état actuel est Il est "transféré" selon l'état qui a existé auparavant.

Une autre difficulté ici est de définir l'état, qui est en général apparenté à de nombreux autres états. Cela semble très abstrait, examinons quelques exemples

2. Trouver un terrain d'entente à travers les problèmes

01 Le problème du sac à dos - mène au problème

Ce genre de problème, je crois que tout le monde connaît ce genre de problème, mais l'objectif de cet article n'est pas de résoudre le problème, mais d'expliquer les caractéristiques de la programmation dynamique et comment faire de la programmation dynamique à l'avenir à travers plusieurs dynamiques. la programmation questionne la question.

Voyons d'abord comment est défini le tableau dp du problème de programmation dynamique :

Veuillez ajouter une description de l'image

dp[i][j] = max(dp[i-1][j] + dp[i-1][j-weight])	// 意思就是在第i个物品选和不选两种情况里选一个最大值

Selon le tableau bidimensionnel de la figure, vous pouvez connaître ile nombre d'articles et jla capacité du sac à dos.

De nombreuses personnes peuvent comprendre les idées de résolution de problèmes d'autres personnes lorsqu'elles lisent les solutions d'autres personnes et peuvent comprendre pourquoi elles sont écrites de cette manière. Mais quand j'écris ce genre de sujet par moi-même, je me sens très mal à l'aise. Je ne peux pas penser à la vie ou à la mort. La chose la plus difficile à laquelle penser est la signification du dp[i][j]milieu iet de la jmoyenne respectivement.

Je donne ici mon avis personnel :

	仔细观察图片中的行和列,就会发现他们都是一维的,例如【背包容量】是[0,maxWeight],【物品数量】是[0,maxNum],而在这个问题中【价值】是二维的,它受到物品数量和背包容量两个因素的影响。
	通常来说,动态规划的问题中对于每一步,都需要面临类似于【选与不选/向左还是向下】这种【二选一】,并且我们想要求得的值一般都会受到两个因素的影响,其中任何一个因素发生改变,都可能会让这个结果也发生改变。因此,通常来说,dp[i][j]的值就是我们【想要求得的结果】,而行和列则是影响着这个结果的两个维度,通常是一维的,也可以理解为是有一个确定范围的维度。
	而为什么物品的种类和价值我们不作为状态来考虑呢?因为他们是不变的,某一个物品的重量和价值已经是固定的了,不会去影响其别的属性。所以我在图中也吧这两个属性单独画在一起
	
	总结一下:动态规划题目特征【二选一】(两种情况选一种),定义行和列,通常是一维的属性,如【数量】,对于dp[i][j]数组中的值

LeetCode 494. Objectif et - Confirmation

sujet:

给你一个整数数组 nums 和一个整数 target 。

向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :

例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。

Exemple:

示例 1:

输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3


示例 2:

输入:nums = [1], target = 1
输出:1

répondre:

Selon la conjecture précédente, nous utilisons maintenant cette question pour confirmer si l'idée précédente est correcte

Pourquoi dites-vous qu'il s'agit d'un problème de programmation dynamique ? Parce que d'après le titre, on peut clairement sentir que [choose one of two], un nombre est soit positif soit négatif, est-il très cohérent avec les caractéristiques que nous avons dites précédemment.

​ La prochaine étape consiste à déterminer quel est notre [résultat souhaité]. Évidemment, ce que nous voulons afficher dans le titre est [le nombre de méthodes]. Ensuite, nous analyserons les deux [un certain nombre de méthodes] qui sont affectées par ce [nombre de méthodes] L'influence du facteur de dimension], le premier est [nombre de nombres i], la plage est [0,nums.length], le second est [la somme des i premiers nombres], la plage est [-sum,+sum].

​ Vérifiez maintenant si cela est conforme à ce que nous avons dit plus tôt, le [résultat souhaité] est affecté par deux [facteurs unidimensionnels]. Lorsque le nombre de nombres optionnels change, le nombre de méthodes changera également. Il ne fait aucun doute que si [la somme des i nombres précédents] change, le nombre de méthodes changera également. Après vérification, il n'y a aucun problème.

La dernière étape est la dérivation de l'équation de transfert dynamique. Avec la fondation précédente, il suffit de la déduire. Si le processus de dérivation trouve quelque chose qui ne va pas, revenez en arrière et regardez les étapes précédentes pour trouver le problème. Il se peut que le facteur unidimensionnel ne soit pas sélectionné correctement. Maintenant, nous commençons à dériver l'équation de transfert dynamique :

image

上图是leetCode某题解的一个图,为了方便理解动态转移方程,我就拿过用了。

因为对于一个数,要么为正,要么为负

我们在进选择之前肯定是有一个起点的,这个起点就是可以选择的数是0个的时候,这个时候的总和为0,对应到数组中就是dp[0][8] = 1,表示0个数的时候,和为0,只有一种方法。

接下来我们遇到了第一个数:1,我们可以选择正的或者负的,就可以根据dp[0][8] = 1得到dp[1][7] = dp[1][7] + 1和dp[1][9] = dp[1][9] + 1;由此往下以此类推就会得到所有可能的情况,这里一定要自己去推敲一下。

由此,我们得到了【动态转移方程】: 逐层往下,一直dp[i][j]可以推导出dp[i+1][j+num[i]] = dp[i+1][j+num[i]] + dp[i][j],dp[i+1][j-num[i]] = dp[i+1][j-num[i]] + dp[i][j](这里的num[i]就是下一行要进行选择的数)

然后我们只【需要的结果】就是dp[nums.length][target + 8]

Seul le code de cette partie de l'équation de transfert dynamique est affiché ici :

for (int row = 0; row < nums.length; row++) {
    for (int col = 0; col < dp[row].length; col++) {
        if (dp[row][col]!=0){
            dp[ row + 1 ][ col - nums[row] ] += dp[row][col];
            dp[ row + 1 ][ col + nums[row] ] += dp[row][col];
        }
    }
}

Une autre façon de penser :

​ L'idée ci-dessus est la plus facile à penser. Il y en a une autre un peu plus ingénieuse que celle-ci, mais elle sera plus difficile à penser. Pour le dire crûment, il s'agit de changer le problème de 哪些是正哪些是负l'un à l'autre . 选哪些数组合成和为x, qui devient une question de savoir s'il faut choisir ou ne pas choisir. , mais cela nécessite une petite dérivation, tant que la somme des valeurs absolues de tous les nombres et la cible cible (la somme de tous les nombres positifs et négatifs) sont déterminés, il peut être obtenu 正数的和, nous n'avons donc qu'à le résoudre 选前i个数组成和为x的方法个数.

En prenant l'exemple 1 dans la question comme exemple, lorsque la somme des nombres est 5, la cible est 3, nous avons seulement besoin de connaître le nombre de combinaisons qui font que les nombres positifs ne totalisent que 4. Cette compréhension ne s'étend pas pour dire ceci

3. Résumé

Aujourd'hui, j'ai principalement expliqué les caractéristiques du problème de programmation dynamique, comment l'équation de transfert dynamique est obtenue et comment réfléchir au plan de solution face à de tels problèmes. J'aurai l'occasion de parler de la méthode d'optimisation du tableau bidimensionnel de programmation dynamique dans un tableau à un bit à l'avenir.

Si vous avez des doutes sur le contenu de cet article ou si vous ne comprenez pas, veuillez laisser un message et vous répondrez à temps lorsque vous le verrez.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44829930/article/details/120998682
conseillé
Classement