算法练习之DP 求LCM (最长公共子序列)
来源:互联网 发布:swift编程指南 编辑:程序博客网 时间:2024/06/09 19:26
1. 对于序列x[1,i]和y[1,j],推导递推公式
1.a 如果当前元素相同,那么就将当前最大相同数+1
2.b 如果当前元素不同,那么就把当前最大相同数“传递”下去
因此递推公式为:
由于x[i]!=y[j]的情况不难可以对x[i]==y[j]时的情况化简得:
3. C# 代码示例:
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]) + 1x[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.b 运用公式填表,如下所示
A B C D B C0 0 0 0 0 0B 00 1 1 1 2 2A 01 1 1 1 2 2 D 01 1 1 2 2 2C 01 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];}
0 0
- 算法练习之DP 求LCM (最长公共子序列)
- DP最长公共子序列算法LCM
- DP(求最长公共子序列)
- dp之最长公共子序列算法
- DP之最基本的求最长公共子序列
- LCS 求最长公共子序列 dp
- DP—求最长公共子序列LCS(代码)
- 【基础算法】求最长公共子序列
- DP算法---最长公共子序列
- 算法(DP):最长公共子序列问题
- 算法提高 最长公共子序列 (DP VS 递归)
- DP之最长公共子序列 LCS
- dp之最长公共子序列
- DP之最长公共子序列
- 判断子序列、求最长公共子序列算法实现
- 算法之最长递增子序列,最长公共子序列
- 算法之最长递增子序列,最长公共子序列
- POJ 3356 AGTC(dp之公共最长子序列)
- fragment Trying to instantiate a class com.example.testhuanxindemo.MyFragment that is not a Fragmen
- NSClassFromString isKindOfClass
- Metaio in Unity3d 教程---Metaio扫描图片要求(Image Tracking)
- Android学习笔记01:Paint及Canvas的简单应用
- python编辑器对比和推荐
- 算法练习之DP 求LCM (最长公共子序列)
- Swift 2.0
- python模块 - re模块使用示例
- Android笔记之获取视频、图片缩略图
- Android自适应不同屏幕几种方法
- matlab中 tic,toc函数的用法
- Metaio in Unity3d 教程--- 三. 使用ID Marker作为扫描目标
- 扫盲:字符编码与字符集的区别(2010年10月9日修改)
- Ubuntu下安装PHP的mongodb扩展