算法练习之DP 求LCM (最长公共子序列)

算法练习之DP 求LCM (最长公共子序列)

大家好,又见面了,我是全栈君。

1. 对于序列x[1,i]和y[1,j],推导递推公式
1.a 假设当前元素同样,那么就将当前最大同样数+1
2.b 假设当前元素不同。那么就把当前最大同样数“传递”下去

因此递推公式为:

x[i] == y[j] : dp[i][j] = Max(dp[i-1][j-1],dp[i][j-1],dp[i-1][j]) + 1
x[i] != y[j] : dp[i][j] = Max(dp[i][j-1],dp[i-1][j])

因为x[i]!=y[j]的情况不难能够对x[i]==y[j]时的情况化简得:

x[i] == y[j] : dp[i][j] = dp[i-1][j-1] + 1

2. 依据公式填充dp数组


比如,对于ABCDBC 和 BADC这两个字符串,在最长公共子串时 :


2.a 第一列置0,即将dp[0][j]和dp[i][0] = 0

2.b 运用公式填表,例如以下所看到的


 	A B C D B C
	0 0 0 0 0 0
B 0	0 1 1 1 2 2
A 0	1 1 1 1 2 2 
D 0	1 1 1 2 2 2
C 0	1 1 2 2 2 3

3. C# 代码演示样例:

void Main()
{
	var r = DP_LCS("ABCDBC","BADC");
	Console.WriteLine(r);
}


static int DP_LCS(string x, string y){


int[,] dpArr = new int[x.Length+1,y.Length+1];


for(var i = 0 ;i <= x.Length; i++){
for(var j = 0 ;j <= y.Length; j++){
if(i == 0 || j == 0){
dpArr[i,j] = 0;
}


else if (x[i - 1] == y[j - 1]){
dpArr[i,j] = dpArr[i-1,j-1] + 1;
}
else {
dpArr[i,j] = Math.Max(dpArr[i-1,j],dpArr[i,j-1]);
}




}
}


return dpArr[x.Length, y.Length];


}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116160.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • pve安装docker图形化_怎么安装docker

    pve安装docker图形化_怎么安装docker基本相当于转载,但我光贴图也不行啊,还是把步骤加上去年年底这NUC到手时,就装PVE练手,然而最后做主力挂机的是那会买的个1037U小主机当时就尝试过装LibreELEC,结果是接显示器黑屏不过后来我直接在宿主机上装桌面和Kodi,但是吧那源里的Kodi是17的对于x265是软解。。。怎么装当然是看的值得买上的这个人家是OMV咱这是PVE都是装桌面再装KODI,但是为了保持纯净的PVE所以才想直通…

    2022年10月30日
  • C语言中的移位运算

    C语言中的移位运算移位运算移位运算包括左移和右移左移运算:x&amp;lt;&amp;lt;k:x左移k位,并在右端补零。右移运算:逻辑右移:x&amp;gt;&amp;gt;k:x右移k位,并在左端补零。算术右移:x&amp;gt;&amp;gt;k:x右移k位,并在左端补最高有效位的值。下表为对一个8位参数x的两个不同的值做不同的一位操作得到的结果:操作值参数x[01100011][10010101]x&amp;l

  • Mac OS 下三种修改Hosts文件的方法

    Mac OS 下三种修改Hosts文件的方法

  • testlink安装教程_轻松吊安装

    testlink安装教程_轻松吊安装采用Xmapp的配置环境,TestLink轻松搞定!

  • tkmapper教程_trello怎么用

    tkmapper教程_trello怎么用tkMappertkMapper整合整合mybatis依赖配置类启动类扫描整合tkMapper依赖修改启动类的`@MapperScan`注解的包tkMapper使用创建数据表创建实体类创建Mapper接口测试tkMapper的常用方法增删改添加修改删除查询查询所有根据主键查询条件查询分页查询带条件分页查询基于MyBatis提供了很多第三方插件,这些插件通常可以完成数据操作方法的封装(GeneralDAO)、数据库逆向工程工作(根据数据表生成实体类、生成映射文件)tkMapper就是一个MyBatis

  • spring整合log4j_log4j2异步日志配置

    spring整合log4j_log4j2异步日志配置常用日志框架log4j、log4j2(log4j的升级版,最常用的)、logback(spring boot默认)、Jboss-logging…等slf4 是日志接口规范,代码对接slf4,实现和具体日志框架解耦,无需修改编码即可切换日志框架。修改pom依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号