940 AlvinZH的最“长”公共子序列

思路

DP,难题。

\(dp[i][j]\) :记录A的前i个字符与B的前j个字符变成相同需要的最小操作数。

初始化:dp[i][0] = i, dp[0][i] = i。分别代表i次删除or添加操作。

三种操作得到dp[i][j],取其中最小值:

  • 替换:可能不需要替换,所以是dp[i-1][j-1]+Same(A[i-1],B[j-1]);
  • 删除:dp[i-1][j]+1;
  • 添加:dp[i][j-1]+1。

千万不要纠结操作的序列是A还是B!

其实这是《算法导论》上一个“编辑距离”问题,比较经典,有兴趣的同学可以看看书or百度看看。

分析

没法分析,DP岂是我等凡人能理解的,sad。

稍微分析,时间复杂度O(n^2)。

参考代码一

//
// Created by AlvinZH on 2017/10/16.
// Copyright (c) AlvinZH. All rights reserved.
// #include <cstdio>
#include <cstring> char A[1005], B[1005];
int dp[1005][1005];//记录A的前i个字符转换到B的前j个字符的最小操作数 inline int Same(char a, char b) {
if(a == b) return 0;
else return 1;
}
inline int MIN(int a, int b, int c) {
if(a > b) a = b;
if(a > c) a = c;
return a;
} int main()
{
while(~scanf("%s %s", A, B))
{
int lenA = strlen(A);
int lenB = strlen(B); for (int i = 0; i <= lenA; ++i)
dp[i][0] = i;//i次删除操作
for (int i = 0; i <= lenB; ++i)
dp[0][i] = i;//i次添加操作 for (int i = 1; i <= lenA; ++i) {
for (int j = 1; j <= lenB; ++j) {
dp[i][j] = MIN(dp[i-1][j-1]+Same(A[i-1],B[j-1]), dp[i-1][j]+1, dp[i][j-1]+1);
//MIN(替换, 删除, 添加)
}
} printf("%d\n", dp[lenA][lenB]);
}
}

2016级算法第四次上机-F.AlvinZH的最“长”公共子序列的更多相关文章

  1. 2016级算法第六次上机-F.AlvinZH的学霸养成记VI

    1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...

  2. 2016级算法第四次上机-D.AlvinZH的1021实验plus

    978 AlvinZH的1021实验plus 思路 贪心,中等题. 使用miss变量表示未覆盖的最小数字,初始值为1. 初始覆盖区间为[1,miss),目标是覆盖[1,m],即miss需要大于m. 需 ...

  3. 2016级算法第四次上机-C.AlvinZH的1021实验

    975 AlvinZH的1021实验 思路 贪心,简单题. 题目已经说明有且只有一种方法表示所求数,简单列举几项可以发现只由前i个砝码会可以表示[1,∑Wi]的所有数的.先找到最大需要的砝码Wi,问题 ...

  4. 2016级算法第四次上机-E.Bamboo and the Ancient Spell

    Bamboo and the Ancient Spell 分析 可能英文读题难度比较大,但是只要看到全大写的 "THE LONGEST COMMON SUBSEQUENCE !"应 ...

  5. 2016级算法第四次上机-B ModricWang的序列问题

    1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升 ...

  6. 2016级算法第五次上机-F.ModricWang的水系法术

    1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量 ...

  7. 2016级算法第四次上机-G.ModricWang的序列问题 II

    1021 ModricWang的序列问题II 思路 此题与上一题区别不是很大,只是增加了一个长度限制,当场通过的人数就少了很多. 大体解题过程与上一题相同.区别在于对\(f[]\) 的操作.没有长度限 ...

  8. 2016级算法第三次上机-F.ModricWang的导弹防御系统

    936 ModricWang的导弹防御系统 思路 题意即为:给出一个长度为n的序列,求出其最长不降子序列. 考虑比较平凡的DP做法: 令\(nums[i]\) 表示这个序列,\(f[x]\) 表示以第 ...

  9. 2016级算法第四次上机-A.Bamboo 和人工zz

    Bamboo和人工ZZ 题意: 非常直白,经典的动态规划矩阵链乘问题 分析: 矩阵链A1A2..An满足结合律,可以使用加括号的方式,降低运算代价. 一个pq的矩阵和一个qr的矩阵相乘,计算代价为pq ...

随机推荐

  1. ubuntu18 tensorflow faster_rcnn cpu训练自己数据集

    (flappbird) luo@luo-ThinkPad-W540:tf-faster-rcnn$ ./experiments/scripts/train_faster_rcnn.sh 0 pasca ...

  2. STM32 FATFS文件系统移植

    http://www.360doc.com/content/11/1221/10/7736891_173820469.shtml

  3. Zookeeper使用--Java API

    1  创建节点 创建节点有异步和同步两种方式.无论是异步或者同步,Zookeeper都不支持递归调用,即无法在父节点不存在的情况下创建一个子节点,如在/zk-ephemeral节点不存在的情况下创建/ ...

  4. line1: 1: Syntax error: word unexpected (expecting ")")

    行时错误:line1: 1: Syntax error: word unexpected (expecting ")") 查看Makefile编译规则,可能由于依赖关系造成编译器使 ...

  5. hibernate的hibernate.cfg.properties

    1.hibernate.cfg.properties  配置文件要放在工程目录src下,编译的时候会自动放在/bin目录下 ,所以Configuration configuration=new Con ...

  6. 实践作业4:Web测试----细化分工DAY1.

    会议时间:2017年12月23日 会议地点:东九教学楼教师休息室 主持人:吴辉 参会人员:吴辉.刘思佳.郜昌磊.王俊杰.吴慧杰 记录人:刘思佳 会议议题:本次作业的分工以及初期安排 工具选择 软件测试 ...

  7. left join、right join、inner join、full join

    转自:某一网友 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join ...

  8. JavaScript语言精粹 笔记05 正则表达式

    正则表达式 正则表达式以方法的形式被用于对字符串中的信息进行查找.替换画图提取操作.可处理正则表达式的方法有:regexp.exec, regexp.test,string.match, string ...

  9. C# 过滤SQL 字符串中的 参数

    /// <summary> /// 参数过滤 /// </summary> /// <param name="parameters"></ ...

  10. 桂林理工大学第十届java程序设计初试竞赛试题

    原创 三.程序设计题(不得改变已经给出的部分,允许添加新的辅助函数或类)(共36分) (6分)1.以下函数的功能是判断一个正整数是否为质数,若是返回true,否则返回false.其中参数data为要判 ...