正文

HDU 1053 Advanced Fruits (DP)2009-07-11 16:32:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/1mi2/45123.html

分享到:

和算法书上讲的那个最大公共了串是一样的。 一开始tl了几次。因为忘记d[i][j]=0的这种情况了! f[i][j]保存的是a的前i个字符和b的前j个字符的最大子串。 d[i][j]保存的是最大值是如何得来的。d[i][j]=0表示到目前为止还没有相同的子串 d[i][j]=1表示a[i]==b[j] d[i][j]=2表示从左得来 d[i][j]=3表示从上得来  #include<stdio.h>#include<iostream>#include<string.h>int f[105][105];int d[105][105];using namespace std;int main(){ int len1,len2,i,j,len; char a[105],b[105]; char c[210];  while(scanf("%s%s",a,b)!=EOF) {  len1=strlen(a);  len2=strlen(b);  for(i=0;i<len2;i++)//初始条件  {   if(a[0]==b[i])   {    f[0][i]=1;    d[0][i]=1;    for(i++;i<len2;i++)    {     f[0][i]=1;     d[0][i]=2;    }    break;   }   else{ f[0][i]=0;d[0][i]=0;}  }  for(i=0;i<len1;i++)  {   if(a[i]==b[0])   {    f[i][0]=1;    d[i][0]=1;    for(i++;i<len1;i++)    {     f[i][0]=1;     d[i][0]=3;    }    break;   }   else   {    f[i][0]=0;d[i][0]=0;   }  }  for(i=1;i<len1;i++)   for(j=1;j<len2;j++)   {    if(a[i]==b[j])    {     f[i][j]=f[i-1][j-1]+1;     d[i][j]=1;    }    else if(f[i-1][j]>f[i][j-1])    {     f[i][j]=f[i-1][j];     d[i][j]=3;    }    else    {      f[i][j]=f[i][j-1];     d[i][j]=2;    }   }  c[205]='\0';  len=204;  i=len1-1;  j=len2-1;     while(i>=0&&j>=0)    {     if(d[i][j]==1)     {      c[len--]=a[i];      i--;j--;          }     else if(d[i][j]==2)     {      c[len--]=b[j];      j--;     }     else if(d[i][j]==3)     {      c[len--]=a[i];      i--;     }     else if(d[i][j]==0)     {      c[len--]=b[j];      c[len--]=a[i];      i--;      j--;     }    }    while(i>=0)    {     c[len--]=a[i];     i--;    }    while(j>=0)    {     c[len--]=b[j];     j--;    }    printf("%s\n",&c[len+1]);  } return 0;}

阅读(1708) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册