典型的dp问题中关于LCS的题目
只要把握如下核心
if(s1[i]==s2[j])
len[i][j]=len[i-1][j-1]+1
else
len[i][j]=max(len[i-1][j],len[i][j-1])
用一个矩阵表示,举个例子,比如programn contest
p r o g r a m n
0 0 0 0 0 0 0 0
c 0 0 0 0 0 0 0 0 0
o 0 0 0 1 1 1 1 1 1
n 0 0 0 1 1 1 1 1 2
t 0 0 0 1 1 1 1 1 2
e 0 0 0 1 1 1 1 1 2
s 0 0 0 1 1 1 1 1 2
t 0 0 0 1 1 1 1 1 2
最后直接输出len[MAX_LEN][MAX_LEN]
#include<stdio.h>
#include<string.h>#define MAX_LEN 1000
char sz1[MAX_LEN];
char sz2[MAX_LEN];
int aMaxLen[MAX_LEN][MAX_LEN];
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
int main()
{
while(scanf("%s%s",sz1+1,sz2+1)>0)
{
int nlen1=strlen(sz1+1);
int nlen2=strlen(sz2+1);
int nTmp;
int i,j;
for(i=0;i<=nlen1;i++)
aMaxLen[i][0]=0;
for(j=0;j<=nlen2;j++)
aMaxLen[0][j]=0;
for(i=1;i<=nlen1;i++)
{
for(j=1;j<=nlen2;j++)
{
if(sz1[i]==sz2[j])
aMaxLen[i][j]=aMaxLen[i-1][j-1]+1;
else
{
aMaxLen[i][j]=max(aMaxLen[i][j-1],aMaxLen[i-1][j]);
}
}
}
printf("%d\n",aMaxLen[nlen1][nlen2]);
}
return 0;
}