***********递归版本****************

#include <stdio.h>

#include <string.h>
#define MAXN 1000
 
char a[MAXN+5], b[MAXN+5];
int dp[MAXN+5][MAXN+5]; //first dimension is a
 
int main(int argc, char* argv[])
{
int i, j, alen, blen;
while(gets(a)) {
gets(b);
alen = strlen(a);
blen = strlen(b);
for(i = 0; i <= blen; i++) {
dp[0][i] = 0;
}
for(i = 0; i <= alen; i++) {
dp[i][0] = 0;
}
for(i = 1; i <= alen; i++) {
for(j = 1; j <= blen; j++) {
if(a[i-1] == b[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
}
else {
if(dp[i-1][j] > dp[i][j-1]) {
dp[i][j] = dp[i-1][j];
}
else {
dp[i][j] = dp[i][j-1];
}
}
}
}
printf("%d\n", dp[alen][blen]);
}
return 0;
}
 
*************记忆化搜索版本**************
 
#include <stdio.h>
#include <string.h>
#define MAXN 1000
 
char a[MAXN+5], b[MAXN+5];
int dp[MAXN+5][MAXN+5]; //first dimension is a
 
 
int solve(int i, int j) {
int t1, t2;
if(dp[i][j] != -1) {
return dp[i][j];
}
if(a[i-1] == b[j-1]) {
return dp[i][j] = solve(i-1, j-1) + 1;
}
else {
t1 = solve(i-1, j);
t2 = solve(i, j-1);
if(t1 > t2) {
return dp[i][j] = t1;
}
else {
return dp[i][j] = t2;
}
}
}
 
int main(int argc, char* argv[])
{
int i, j, alen, blen;
while(gets(a)) {
gets(b);
memset(dp, -1, sizeof(dp));
alen = strlen(a);
blen = strlen(b);
for(i = 0; i <= blen; i++) {
dp[0][i] = 0;
}
for(i = 0; i <= alen; i++) {
dp[i][0] = 0;
}
printf("%d\n", solve(alen, blen));
}
return 0;
}
 
**************下面再对空间做下优化**************
 
#include <stdio.h>
#include <string.h>
#define MAXN 1000
 
char a[MAXN+5], b[MAXN+5];
int dp[MAXN+5]; //first dimension is a
 
int main(int argc, char* argv[])
{
int i, j, alen, blen, org, t;
while(gets(a)) {
gets(b);
alen = strlen(a);
blen = strlen(b);
for(i = 0; i <= blen; i++) {
dp[i] = 0;
}
for(i = 1; i <= alen; i++) {
org = 0;
for(j = 1; j <= blen; j++) {
if(a[i-1] == b[j-1]) {
//here should be dp[i][j] = dp[i-1][j-1] + 1;
t= dp[j];
dp[j] = org + 1;
org = t;
}
else {
org = dp[j];
if(dp[j] < dp[j-1]) {
dp[j] = dp[j-1];
}
}
}
}
printf("%d\n", dp[blen]);
}
return 0;
}
 
 
这里的三部曲,恰好对应算法导论里描述LCS的步骤。