当前位置: 首页 > news >正文

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


}


相关文章:

  • C#中的特性Attribute
  • 算法练习 -- DP 查找和为指定数字的数组
  • 2009英雄会后记:最出彩是创业 最关注是产品 最可惜是创富
  • 算法练习--- DP 求解最长上升子序列(LIS)
  • Bellman ford 最短路径算法
  • ArcGIS Server Java ADF 案例教程 14
  • 扩展MongoDB C# Driver的QueryBuilder
  • ArcGIS Server Java ADF 案例教程 15
  • Floyd-Warshall 算法-- 最短路径(适合节点密集的图)
  • 英雄会创业论坛梁宁主持手记-初创业2人,天才少年2人,成功2人
  • Windows Azure系列-- 配置Azure Power Shell
  • 北京英雄会片段
  • Windows Azure 系列-- Azure Redis Cache的配置和使用
  • 2009 CSDN英雄会记事 - 珍惜时间、规划生活
  • LeetCode -- 删除链表中值为k的元素
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • 30天自制操作系统-2
  • export和import的用法总结
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • js学习笔记
  • JWT究竟是什么呢?
  • php的插入排序,通过双层for循环
  • uva 10370 Above Average
  • 京东美团研发面经
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 老板让我十分钟上手nx-admin
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 数据结构java版之冒泡排序及优化
  • 通信类
  • 用 Swift 编写面向协议的视图
  • 在Mac OS X上安装 Ruby运行环境
  • 函数计算新功能-----支持C#函数
  • ​520就是要宠粉,你的心头书我买单
  • #ifdef 的技巧用法
  • (c语言)strcpy函数用法
  • (C语言)球球大作战
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (十六)Flask之蓝图
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net framework4与其client profile版本的区别
  • ::
  • @开发者,一文搞懂什么是 C# 计时器!
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [AutoSar]BSW_Com02 PDU详解
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [BZOJ2850]巧克力王国
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [Java性能剖析]Sun JDK基本性能剖析工具介绍
  • [leveldb] 2.open操作介绍