字符串/序列类DP(一)

题目:P1279 字串距离

\(\text{蒟蒻在DP之路上求索着}\)

这道题让我想起了在一个数字串中添加若干乘号使得乘积最大的问题。我开始考虑在前\(i\)个字符中插入\(j\)个字符的最小距离。后来我发现我不会转移(泪)。于是我打算一步一步,从分析开始找到其中的秘密。

思路

观察这道题是要求字符匹配然后求出最小的差值。因此相比于在字符串中插入空格,不如说是指定哪个字符与哪个字符配对,使得距离最小。于是我又联想到了P1140 相似基因,如果我们设\(f[i][j]\)表示A串中的前i个字符和B串中的前j个字符进行决策所能带来的最小距离,会不会能够更简单呢?

然后根据通常DP的思路,我们应该考虑它的子问题.也就是假设我们前面已经求出了最小距离,接下来应该怎么办呢?在这个题目中我们有三种决策:

  1. \(A_i\)\(B_j\)配对
  2. \(A_i\)与空格配对,把\(B_i\)留在后面
  3. \(B_i\)与空格配对,把\(A_i\)留在后面

我们找到了这三种决策,然后我们考虑能否转移,怎样转移.

如果我们让\(A_i\)\(B_j\)配对,那么就是从\(f[i-1][j-1]\)转移过来,然后加上这两位差的绝对值.

如果我们让\(A_i\)与空格配对,那么就是要求\(B_j\)已经和A中之前的字符或空格配对了,这样才能保证前i位对应前j位,然后加上常数K

同理,如果让\(B_i\)与空格配对,就要求\(A_i\)与B中之前的东西配对,然后加上常数K.

这样看来,我们转移到\(f[i][j]\)时,需要从以下三个决策中取得最小值:
\[ 1.f[i-1][j-1]+|A[i]-B[j]|(\text{两串配对})\\ 2.f[i-1][j]+K(\text{A与空格配对})\\ 3.f[i][j-1]+K(\text{B与空格配对}) \]
然后还有一点就是我们显然是需要初始化的,不能什么都不匹配.所以我们让两串分别先配对空格.最后我们的目标是\(f[lenth(A)][length(B)]\)

类似的问题还有很多,以后再继续讲解

转载于:https://www.cnblogs.com/i-cookie/p/11583787.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值