标签:
1. 对于序列x[1,i]和y[1,j],推导递推公式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] : dp[i][j] = dp[i-1][j-1] + 1
2. 根据公式填充dp数组
例如,对于ABCDBC 和 BADC这两个字符串,在最长公共子串时 :
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
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];
}标签:
原文地址:http://blog.csdn.net/lan_liang/article/details/46619175