longest common subsequence
2008-02-29 19:47
405 查看
Following is a DP solution of this problem.
/**//*
Name: LCS.H
Copyright: All Right Reserved 2008 Li Zu-ding
Author: li zu-ding<lizuding@gmail.com>
Date: 29-02-08 08:47
Description: this code is the answer of longest common subsquence(LCS) problem
*/
#include <iostream>
#include <assert.h>
using namespace std;
enum Direct ...{ kNull = 0, kUpperRight, kUpper, kRight };
template <typename T, int size1, int size2>
void length_of_lcs(T (&str1)[size1], T (&str2)[size2],
int (&length)[size1][size2],
Direct (&direct)[size1][size2]) ...{
int i, j;
for (i = 0; i < size1; ++i)
length[i][0] = kNull;
for (j = 0; j < size2; ++j)
length[0][j] = kNull;
for (i = 1; i < size1; ++i)
for (j = 1; j != size2; ++j) ...{
if (str1[i] == str2[j] ) ...{
length[i][j] = length[i-1][j-1] + 1;
direct[i][j] = kUpperRight;
} else ...{
if (length[i-1][j] > length[i][j-1]) ...{
length[i][j] = length[i-1][j];
direct[i][j] = kRight;
} else ...{
length[i][j] = length[i][j-1];
direct[i][j] = kUpper;
}
}
}
}
template <typename T, typename Functor, int size1, int size2>
void construct_lcs(Direct (&direct)[size1][size2],
T (&r_str)[size1],
int i, int j, Functor functor) ...{
if ((0 == i) or (0 == j))
return;
if (kUpperRight == direct[i][j]) ...{
functor(r_str[i]);
construct_lcs(direct, r_str, i-1, j-1, functor);
} else
if (kUpper == direct[i][j])
construct_lcs(direct, r_str, i, j-1, functor);
else
if (kRight == direct[i][j])
construct_lcs(direct, r_str, i-1, j, functor);
}
struct print
...{
void operator()(char c) ...{ cout << c << " "; }
};
/**//*
Name: LCS.H
Copyright: All Right Reserved 2008 Li Zu-ding
Author: li zu-ding<lizuding@gmail.com>
Date: 29-02-08 08:47
Description: this code is the answer of longest common subsquence(LCS) problem
*/
#include <iostream>
#include <assert.h>
using namespace std;
enum Direct ...{ kNull = 0, kUpperRight, kUpper, kRight };
template <typename T, int size1, int size2>
void length_of_lcs(T (&str1)[size1], T (&str2)[size2],
int (&length)[size1][size2],
Direct (&direct)[size1][size2]) ...{
int i, j;
for (i = 0; i < size1; ++i)
length[i][0] = kNull;
for (j = 0; j < size2; ++j)
length[0][j] = kNull;
for (i = 1; i < size1; ++i)
for (j = 1; j != size2; ++j) ...{
if (str1[i] == str2[j] ) ...{
length[i][j] = length[i-1][j-1] + 1;
direct[i][j] = kUpperRight;
} else ...{
if (length[i-1][j] > length[i][j-1]) ...{
length[i][j] = length[i-1][j];
direct[i][j] = kRight;
} else ...{
length[i][j] = length[i][j-1];
direct[i][j] = kUpper;
}
}
}
}
template <typename T, typename Functor, int size1, int size2>
void construct_lcs(Direct (&direct)[size1][size2],
T (&r_str)[size1],
int i, int j, Functor functor) ...{
if ((0 == i) or (0 == j))
return;
if (kUpperRight == direct[i][j]) ...{
functor(r_str[i]);
construct_lcs(direct, r_str, i-1, j-1, functor);
} else
if (kUpper == direct[i][j])
construct_lcs(direct, r_str, i, j-1, functor);
else
if (kRight == direct[i][j])
construct_lcs(direct, r_str, i-1, j, functor);
}
struct print
...{
void operator()(char c) ...{ cout << c << " "; }
};
相关文章推荐
- UVA - 10405 Longest Common Subsequence (LCS最长公共子序列)
- uva10405 - Longest Common Subsequence
- UVa 10405 - Longest Common Subsequence
- uva10405 Longest Common Subsequence
- UVA 10405 - Longest Common Subsequence
- uva 10405 - Longest Common Subsequence(注意空格陷阱)
- 求最长公共子序列Longest Common Subsequence LCS
- LCS(Longest Common Subsequence 最长公共子序列)
- LCS(Longest Common Subsequence)
- Longest Common Subsequence
- Longest Common Subsequence 解题报告
- UVA 10405 Longest Common Subsequence --经典DP
- UVA 10405 Longest Common Subsequence --经典DP
- UVA 10405 Longest Common Subsequence
- 最长公共子序列LCS(The longest common subsequence)
- LCS (Longest Common Subsequence) 字符串最长公共子串算法
- uva_10405 Longest Common Subsequence
- Longest Common Subsequence (LCS)
- 求解最长公共子序列(Longest Common Subsequence,LCS)
- Longest Common Subsequence _dp