algorithm - 为什么这个动态规划递归关系是正确的?

标签 algorithm dynamic-programming

假设你有一个屏幕。现在我们可以在屏幕上进行两个操作:

  1. 复制屏幕上的内容

  2. 将复制的内容粘贴到屏幕上

假设一开始,剪贴板是空的,并且屏幕上有一个字符。如果我们有N次操作,我们如何使用N次复制和粘贴操作在屏幕上打印最大数量的字符?

答案是 DP[N]=max(2DP[N-2],3DP[N-3])

但是我们如何得到上面的结果呢?为什么下面的公式不正确?

  1. DP[N]=max(DP[N-1],2DP[N-2])

  2. DP[N]=2DP[N-2]

最佳答案

解释正确的重现

如果第 N 操作为打印,则第 N-1 操作可以是复制或粘贴。

  1. N-1次复制,N次粘贴。
    N-1 处复制意味着复制 dp[N-2] 个字符,因此这里的总数变为 2*dp[N-2]
  2. N-2次复制,N-1次粘贴,N次粘贴。
    N-2 处复制意味着复制 dp[N-3] 个字符,因此这里的总数变为 3*dp[N-3] (原始dp[N-3] +粘贴两次)。
  3. N-3复制 3 次粘贴是没有意义的,因为您可能会通过步骤 1 两次获得相同的结果。

因此结果变为dp[N] = max(2*dp[N-2],3*dp[N-3])

复发问题

  1. DP[N]=max(DP[N-1],2DP[N-2]) 不起作用,因为无法跟踪您是否拥有 N第一个操作为复制或粘贴。
  2. DP[N]=2DP[N-2] 错过了两次连续粘贴的情况(提示:列出了 dp 表中的前几个值,请找出dp[5] 的情况:
i -> dp[i]
0      0
1      1
2      2
3      2
4      4
5      6

关于algorithm - 为什么这个动态规划递归关系是正确的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71817943/

相关文章:

algorithm - 基于距离和约会时间的约会地点路线

python - 人员匹配程序或算法

algorithm - 为什么 igraph 的 cliques() 方法比 justTheCliques 慢几个数量级?

c - 从动态规划函数中获取值

algorithm - 使用最少的插入将字符串转换为回文字符串

java - DP-Coin 找零结果为零

algorithm - 查找给定开始和结束时间的并发事件数

将一组偏好与单个结果相匹配的算法?

algorithm - 对于想要了解动态规划的人的一个简单示例

python - 将输入数字转换为字母表示