poj-1458(lcs)

  • 题目链接: http://poj.org/problem?id=1458

  • 题目大意: 最长公共子序列

  • 思路: DP[i][j]表示从到 s_0…s_j, t_0…t_j 的LCS,状态转移方程如代码所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using namespace std;
const int kMaxN = 501;
char kStrA[kMaxN];
char kStrB[kMaxN];
int kDp[kMaxN][kMaxN];
int ()
{
while(cin>>kStrA>>kStrB){
int len1 = strlen(kStrA);
int len2 = strlen(kStrB);
memset(kDp, 0, sizeof(kDp));
for(int i = 0; i < len1; ++i){
for(int j = 0; j < len2; ++j){
if(kStrA[i] == kStrB[j]){
kDp[i+1][j+1] = kDp[i][j] + 1;
}else{
kDp[i+1][j+1] = max(kDp[i+1][j], kDp[i][j+1]);
}
}
}
cout<<kDp[len1][len2]<<endl;
}
return 0;
}