很有意思的一个题


试题描述
给定字符串A和字符串B,要求找一个最短的字符串,使得字符串A和B均是它的子序列。
输入
输入包含两行,每行一个字符串,分别表示字符串A和字符串B。(串的长度不超过30)
输出
输出A和B最短公共父串的长度以及在该长度下可以生成的父串个数,用空格隔开。
输入示例
ABAAXGF
AABXFGA
输出示例
10 9
其他说明
ABAAXGF和AABXFGA的最短公共父串之一是AABAAXGFGA,长度为10,满足该长度的父串一共有9个。

看到这个题有没有想到最长公共子序列??这个题情况类似

我们用dp[i][j]表示第一个串前i位以及第二个串前j位最短公共父串的长度,用f[i][j]同理表示有几个最短公共父串

不难得到

当a[i]==b[j]时 dp[i][j]=dp[i-1][j-1]+1

否则dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1(参见最长公共子序列)

同样的

当a[i]==b[j]时说明串的个数应该从f[i-1][j-1]的位置转移 于是f[i][j]=f[i-1][j-1]

否则:

(1)当dp[i-1][j]<dp[i][j-1]时说明从f[i-1][j]转移的父串最短 于是f[i][j]=f[i-1][j]

(2)当dp[i][j-1]<dp[i-1][j]时说明从f[i][j-1]转移的父串最短 于是f[i][j]=f[i][j-1]

(3)当dp[i-1][j]==dp[i][j-1]时说明两边转移的父串都是最短 于是f[i][j]=f[i-1][j]+f[i][j-1]

上代码

#include<iostream>
#include<cstring>
using namespace std;
int dp[][],f[][],len1,len2,cnt;
char a[],b[];
int main()
{
gets(a+),gets(b+);
len1=strlen(a+),len2=strlen(b+);
for(int i=;i<=max(len1,len2);i++)dp[i][]=dp[][i]=i;
for(int i=;i<=max(len1,len2);i++)f[i][]=f[][i]=;
for(int i=;i<=len1;i++)
{
for(int j=;j<=len2;j++)
{
if(a[i]==b[j])
{
dp[i][j]=dp[i-][j-]+;
f[i][j]=f[i-][j-];
}
else
{
dp[i][j]=min(dp[i-][j],dp[i][j-])+;
if(dp[i-][j]<dp[i][j-])f[i][j]=f[i-][j];
else if(dp[i][j-]<dp[i-][j])f[i][j]=f[i][j-];
else f[i][j]=f[i-][j]+f[i][j-];
} }
}
printf("%d %d",dp[len1][len2],f[len1][len2]);
}

2018.11.2 2018NOIP冲刺之最短公共父串的更多相关文章

  1. LRJ入门经典-0906最短公共父串305

    原题 LRJ入门经典-0906最短公共父串305 难度级别:B: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 给定字符串A和字符串B,要求 ...

  2. 2018.10.20 2018NOIP冲刺之酒厂选址

    题目传送门 明显能够看出有一个建图求路程的优化 然而发现10000*10000爆空间QAQ 为了做一些初始化方面的优化 我们发现了一个叫做前缀和的东西 可以在环上查到两个之间的最短距离 同时还要做一些 ...

  3. 2018.10.1 2018NOIP冲刺之立体图

    2008NOIP普及组立体图 请自行百度(事实上放不下了) 图不是很清楚 下面有 [输入] 输入文件 drawing.in 第一行有用空格隔开的 2 个整数 m 和 n,表示有 m*n  个格子 (1 ...

  4. 2018.9.26 2018NOIP冲刺之栈

    最小字典序(stack) 输入序列中有 n 个正整数,栈 S 开始为空. 你每次只可以进行下面两种操作之一:① 将输入序列头端的数据移至 S 栈顶(进 S 栈): ②  将 S 栈顶元素输出并删除(退 ...

  5. 2018.9.8 2018NOIP冲刺之配对

    普及组第四题难度 主体思路竟然是贪心Q_Q 链接:https://www.nowcoder.com/acm/contest/164/D来源:牛客网 题目描述 小A有n个长度都是L的字符串.这些字符串只 ...

  6. OI生涯回忆录 2018.11.12~2019.4.15

    上一篇:OI生涯回忆录 2017.9.10~2018.11.11 一次逆风而行的成功,是什么都无法代替的 ………… 历经艰难 我还在走着 一 NOIP之后,全机房开始了省选知识的自学. 动态DP,LC ...

  7. China Intelligent Office Summit(2018.11.21)

    时间:2018.11.21地点:中关村软件园国际会议中心

  8. International Programming Retreat Day(2018.11.17)

    时间:2018.11.17地点:北京国华投资大厦

  9. Intel Artificial Intelligence Conference(2018.11.14)

    时间:2018.11.14地点:北京国贸大酒店

随机推荐

  1. ThreadingTest(线程测试)领先的白框进入这个行业

    测试一直是黑色的,白点.在一般情况下,因为白盒测试需要逻辑思维能力是比较高的技术要求比一般开发商的项目经验和谨慎甚至更高,和较长的测试时间,用于单元测试,昂贵的工具,因此,国内企业普遍忽视白盒测试.这 ...

  2. cocos2d-x 显示触摸操作(单击显示效果浪潮,对于视频演示)-绩效转型

    http://blog.csdn.net/hitwhylz/article/details/26042751 首先是显示触摸操作. 在文章最后.对性能进行一些提升改造. 由于要演示我们的作品.使用试玩 ...

  3. Tab切换顺序设置

    使用TabIndex设置顺序 <StackPanel Orientation="Vertical"> <Button Content="Button1& ...

  4. 通通玩blend美工(1)——荧光Button

    原文:通通玩blend美工(1)--荧光Button 最近老大出差去了,光做项目也有点烦,写点教程消遣消遣(注:此乃初级教程,所以第一个消遣是本人消遣,第二个是指供各位看官消遣...) 看着各位大虾出 ...

  5. 简单说说Delphi中线程的释放

    线程的释放方式有两种:一种是线程在运行完成后自动释放,一种是手动释放. 无论是那种释放,都应该在线程停止后进行释放. 然而线程的停止也有两种情况:一种是不需要设置标志位,直接完成:一种是由于execu ...

  6. git全程笔记(mac环境) git for mac

    一.git的安装 最简单的方式就是直接用git installer安装git(从git官网上下载一个git installler就可以直接安装了),mac上有自带的git,可能版本比较低 后面显示的是 ...

  7. 在 __CC_ARM 编译器环境下,使用$Sub$$ 与 $Super$$ 的“补丁”功能

    $Sub$$ 与 $Super$$ 的“补丁”功能(详见 ARM® Compiler v5.06 for µVision® armlink User Guide): 这是一种特殊模式:用于有一个已经存 ...

  8. Simple BeamSearch Codes for Python

    Code from: https://github.com/SeitaroShinagawa/simple_beamsearch probs = [[[],[0.3,0.7]], [[0],[0.1, ...

  9. Win10《芒果TV》商店版更新v3.1.4.0:适配Xbox手柄B键后退、手机支持暗色主题不伤眼

    在双十一全球剁手节.光棍节欢庆之际,<芒果TV>UWP版迅速更新v3.1.4版,适配Xbox手柄B键全局后退,支持手机切换暗色主题,优化并解决启动卡顿等问题. 芒果TV UWP V3.1. ...

  10. 关于VS编译DevExpress默认产生几个多余的语言包的问题解决

    原文 关于VS编译DevExpress默认产生几个多余的语言包的问题解决 VS15开始对于非系统的Dll都会默认复制到本地,即bin\debug下面,复制dll到本地好处在于发布的时候不用再去寻找相关 ...