字符串/序列类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

时间: 2024-10-20 08:52:09

字符串/序列类DP(一)的相关文章

HDU3109: Worms(字符串变换类 DP)

pro:开始有一个字母虫,然后字母虫在每一天可以选择自己身上的部分字母变换,变换规则形如A->BC. 现状给定最终字母虫的字符串,求最少用了多少天. 如有规则A->BC,B->AC,C->AB:则ACAB可以见过三天(A-BC-ACC-ACAC)或者两天(A-BC-ACAB)得来. 规则不超过80,字符串长度不超过50: sol:dp[i][j][p]表示,最开始只有字母p,变换到[i,j]区间的最小天数. 显然初始:dp[i][i][x]=c[i]==x?0:inf; 其他:  

TOJ 3295 括号序列(区间DP)

描述 给定一串字符串,只由 "["."]" ."(".")"四个字符构成.现在让你尽量少的添加括号,得到一个规则的序列. 例如:"()"."[]"."(())"."([])"."()[]"."()[()]",都是规则的序列.这几个不是规则的,如:"("."[".&quo

0x50 动态规划(0x5C 计数类DP)例题3:装饰围栏(题解)(计数类DP讲解,确定第k个排列)

计数类DP一般就是确定DP状态,DP出排名范围,然后不断逼近. 题意 题目链接 [题目描述] 有 N 块长方形的木板,长度分别为1,2,-,N,宽度都是1. 现在要用这 N 块木板组成一个宽度为 N 的围栏,满足在围栏中,每块木板两侧的木板要么都比它高,要么都比它低. 也就是说,围栏中的木板是高低交错的. 我们称"两侧比它低的木板"处于高位,"两侧比它高的木板"处于低位. 显然,有很多种构建围栏的方案. 每个方案可以写作一个长度为N的序列,序列中的各元素是木板的长度

字符串工具类(指定字符串的长度和判断是否为空等方法)

package com.sec.util; /** * 字符串工具类 * @author Administrator * */public class StringUtil { /** * 过滤<,>,\n 字符串的方法 * @param input * @return */ public static String filterHTML(String input){ if(input == null || input.length() == 0){ return input; } input

也谈C#之Json,从Json字符串到类代码

原文:也谈C#之Json,从Json字符串到类代码  阅读目录 json转类对象 逆思考 从json字符串自动生成C#类  json转类对象 自从.net 4.0开始,微软提供了一整套的针对json进行处理的方案.其中,就有如何把json字符串转化成C#类对象,其实这段代码很多人都清楚,大家也都认识,我就不多说,先贴代码. 1.添加引用 System.Web.Extensions 2.测试一下代码 1 static class Program 2 { 3 /// <summary> 4 ///

《Javascript权威指南》学习笔记之十一:处理字符串---String类和正则表达式

一.正则表达式的基本语法 1.概念:正则表达式由普通字符和特殊字符(元字符)组成的文本模式,该模式描述在查找字符串主体时待匹配的一个或者多个字符串.正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配. 普通字符包括所有的大小写字母字符.所有数字.所有标点符号及一些特殊符号.普通字符本身可以组成一个正则表达式,也可以和元字符组合组成一个正则表达式:而元字符则具有特殊的含义,包括().[].{}./.^.$.*.+.?...|.-.?:.?=.?! 2.基本语法 3.优先权含义 二.使用

codevs 1962 马棚问题--序列型DP

1962 马棚问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 每天,小明和他的马外出,然后他们一边跑一边玩耍.当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚.他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他的马做过多的移动.因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序号.而且,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面.已知共有黑

Android工具类之字符串工具类,提供一些字符串相关的便捷方法

/** * 字符串工具类,提供一些字符串相关的便捷方法 */ public class StringUtil { private StringUtil() { throw new AssertionError(); } /** * is null or its length is 0 or it is made by space * <p/> * <pre> * isBlank(null) = true; * isBlank("") = true; * isBl

字符串验证类

/***************************************************** * 文件名:StringValidation.cs * 功能描述:扩展方法:字符串验证 * 创建时间:2014-6-7 * 作 者: Eric * * 修改时间: * 修改人: * 修改描述 * ******************************************************/ public static class StringValidation { //