您的位置:首页 > 产品设计 > UI/UE

Pku acm 1458 Common Subsequence 动态规划解析

2012-08-17 22:50 459 查看
 详细解析请见~~  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]);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c