LCS最长公共子序列入门题

如果a[i]=b[j]那么dp[i][j]=dp[i-1][j-1]
否则,dp[i][j]=max(dp[i-1][j],dp[i][j-1]
最后dp[l1-1][l2-1]存的就是个数
其实最好应该从1~n但是考虑到数组下标为-1时也为1,所以这种情况可以忽略
(于1个月后发现错误,数组不能下标越界....,注意!)
原代码:
#include <stdio.h>
#include <string.h>
 char a[1005];
 char b[1005];
 int dp[1005][1005];
 int l1,l2;
 int max(int c,int d)
 {
     return c>d?c:d;
 }
 int main()
 {
     int i,j;
    while(scanf("%s%s",a,b)==2)
     {
         l1=strlen(a);
         l2=strlen(b);
         for (i=0;i<l1;i++)
         for (j=0;j<l2;j++)
         if (a[i]==b[j])
         dp[i][j]=dp[i-1][j-1]+1;
         else
         {
             dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
         }
         printf("%d\n",dp[l1-1][l2-1]);
         memset(a,0,sizeof(a));
         memset(b,0,sizeof(b));
         memset(dp,0,sizeof(dp));
     }
     return 0;

 }
修改后的代码
#include <stdio.h>
#include <string.h>
char a[505];
char b[505];
int dp[505][505];
int max(int c,int d)
{
    return c>d?c:d;
}
 int main()
 {
     int n,i,j,l1,l2;
     while(scanf("%s%s",a+1,b+1)==2)
     {
         l1=strlen(a+1);
         l2=strlen(b+1);
         memset(dp,0,sizeof(dp));
         for (i=1;i<=l1;i++)
            for (j=1;j<=l2;j++)
             if (a[i]==b[j])
              dp[i][j]=dp[i-1][j-1]+1;
              else
              {
                  dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
              }
              printf("%d\n",dp[l1][l2]);
              memset(a,0,sizeof(a));
              memset(b,0,sizeof(b));
     }
     return 0;

 }

 

你可能感兴趣的:(LCS最长公共子序列入门题)