详细解析请见~~ http://blog.csdn.net/yangshuolll/article/details/7879349
先写出这个状态转移方程:
E[i][j]=min{ D(i-1,j)+xi ,D(i,j-1)+yi,D(i-1,j-1)+Zi,j }
brute force 方法 超时:有重项 递归调用结果:
#include<stdio.h>
#include<string.h>
char a[10000],b[10000];
int len1,len2,max;
int sum=0;
void cmp(int i,int j,int s)
{
if(i==len1||j==len2){if(max<s)max=s;return;}
if(a[i]==b[j])cmp(i+1,j+1,s+1);
else{
cmp(i,j+1,s);
cmp(i+1,j,s);
}
}
int main()
{
while(scanf("%s",a))
{
sum=0;
max=0;
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
cmp(0,0,0);
printf("%d\n",max);
}
}
进行剪枝:
#include<stdio.h>
#include<string.h>
char a[1000],b[1000];
int len1,len2,max;
int c[1000][1000];
void cmp(int i,int j,int s)
{
if(i==len1||j==len2){if(max<s)max=s;return;}
if(a[i]==b[j]){if(s>=c[i][j]){c[i][j]=s ;cmp(i+1,j+1,s+1);}}
else{
if(s>=c[i][j]){
c[i][j]=s;
cmp(i,j+1,s);
cmp(i+1,j,s);
}
}
}
int main()
{
while(scanf("%s",a)!=EOF)
{
max=0;
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<1000;j++)
c[i][j]=0;
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
cmp(0,0,0);
printf("%d\n",max);
}
}
上面还是会超时:
下面用 动态规划进行处理 详细解析请见~~ http://blog.csdn.net/yangshuolll/article/details/7879349
贴代码 正确代码:
post code
#include<stdio.h>
#include<string.h>
char a[1000],b[1000];
int c[1000][1000];
int max(int a,int b)
{
if(a>b)return a;
return b;
}
int main()
{
int i,j,len1,len2;
while(scanf("%s",a)!=EOF)
{
scanf("%s",b);
len1=strlen(a);
len2=strlen(b);
for(i=0;i<1000;i++)
c[i][0]=c[0][i]=0;
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
if(a[i-1]==b[j-1])c[i][j]=c[i-1][j-1]+1;
else {
c[i][j]=max(c[i-1][j],c[i][j-1]);
}
}
printf("%d\n",c[len1][len2]);
}
}