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

1. 对于序列x[1,i]和y[1,j],,推导递推公式1.a 如果当前元素相同,那么就将当前最大相同数+12.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.a 第一列置0,即将dp[0][j]和dp[i][0] = 0

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 33. 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];}

用最少的浪费面对现在

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

相关文章:

你感兴趣的文章:

标签云: