算法练习之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];


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

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

(0)
上一篇 2022年1月25日 上午9:00
下一篇 2022年1月25日 上午10:00


相关推荐

  • IDEA 全局搜索快捷键 Ctrl +Shift+F,不起作用啦,啥情况

    IDEA 全局搜索快捷键 Ctrl +Shift+F,不起作用啦,啥情况问题描述 IDEA 工具很强大 其中有个全局搜索快捷键 Ctrl Shift F 也是在开发中经常用到的 但是不知道为什么按了就是不起作用 原来是和输入法的简繁体切换冲突了给出一下三种解决方法方案一如你不想要输入法的简繁体切换快捷键 win10 最新版 2017 年 7 月可以直接取消简繁体切换快捷键 搜狗输入法可以在设置里改 如下打开 win 设置 右键任务栏左下角微软的 LOGO 单击设置 点

    2026年3月26日
    2
  • JAVA中几种常用的RPC框架介绍

    JAVA中几种常用的RPC框架介绍RPC 是远程过程调用的简称 广泛应用在大规模分布式应用中 作用是有助于系统的垂直拆分 使系统更易拓展 Java 中的 RPC 框架比较多 各有特色 广泛使用的有 RMI Hessian Dubbo 等 1 RMI 远程方法调用 JAVA 自带的远程方法调用工具 不过有一定的局限性 2 Hessian 基于 HTTP 的远程方法调用 基于 HTTP 协议传输 在性能方面还不够完美 负载均衡和失效转移依赖于

    2026年3月19日
    2
  • 游戏协议测试理论(游戏测试是什么)

    转载:https://blog.csdn.net/SR0ad/article/details/8253126协议测试:针对通信协议进行的测试,是对常规测试的一种补充。重要性:实现一些常规测试中无法实现的流程,修改通信数据包检测服务器异常处理,修改数据包的先后次序检查服务器处理流程。协议测试的主要测试点:1.数据类型溢出:通信双方对协议数据类型的解析不一致,导致内存操作错误。2.数据包…

    2022年4月15日
    88
  • java中人民币的符号怎么打_打印机打印人民币符号¥

    java中人民币的符号怎么打_打印机打印人民币符号¥1 打印机打印人民币符号 标准字库中的全角字符 双字节 的人民币符号为单羊角符 编码为 a3a4 没有双羊角符 而半角字符 单字节 没有人民币符号 只有美元符号 编码为 0x24 而实际上人民币符号一般都是应用在金额等数字组成半角字符 单字节 中 只有这样才和数字等宽 所以一般银行系统都会发 0x24 到打印机 而打印机可根据客户实际要求打印出 等货币符号 具体为修改打印机

    2026年3月19日
    2
  • 埃尔夫斯堡vs赫尔辛堡比分分析_马赛对阿贾克斯

    埃尔夫斯堡vs赫尔辛堡比分分析_马赛对阿贾克斯一、c++STL常用内容总结文章目录一、c++STL常用内容总结1.vector(数组)1.1介绍1.2方法函数1.3注意点1.3.a排序1.3.b访问2.stack(栈)2.1介绍2.2方法函数2.3注意点2.3.a.栈遍历2.3.b.模拟栈3.queue(队列)3.1介绍3.2方法函数4.deque(双端队列)4.1介绍4.2方法函数4.3注意点5.priority_queue(优先队列)5.1介绍5.2函数方法5.3设置优先级5.3.a基本数据类型的优先级5

    2025年5月25日
    6
  • “养龙虾”炒股2天赚近60倍?养“龙虾”安全吗?多部门提示“养龙虾”风险,专家提醒防止AI智能体滥用代理权限

    “养龙虾”炒股2天赚近60倍?养“龙虾”安全吗?多部门提示“养龙虾”风险,专家提醒防止AI智能体滥用代理权限

    2026年3月12日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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