滚动数组处理数据很大的公共子序列问题

 1 #include<string.h>
 2 #include<stdio.h>
 3 char a[5010],b[5010];
 4 short int dp[2][5010];
 5 int LCS(int n,int m)
 6 {
 7     memset(dp, 0, sizeof(dp));
 8     int i,j;
 9     for(i=1;i<=n;i++)
10         for(j=1;j<=m;j++)
11         {
12             if(a[i-1]==b[j-1])
13             {
14                 dp[i%2][j]=dp[(i-1)%2][j-1]+1;
15                 //printf("%d %d %d\n",i%2,j,dp[i%2][j]);
16             }
17             else if(dp[(i-1)%2][j]>=dp[i%2][j-1])
18             {
19                 dp[i%2][j]=dp[(i-1)%2][j];
20                 //printf("%d %d %d\n",i%2,j,dp[i%2][j]);
21             }
22             else
23             {
24                 dp[i%2][j]=dp[i%2][j-1];
25             }
26         }
27         return dp[n%2][m];
28 }
29 int main()
30 {
31    int i,j,n;
32    while(scanf("%d",&n)!=EOF)
33    {
34        getchar();
35        gets(a);
36 
37        for(i=n-1,j=0;i>=0;i--,j++)
38        {
39            b[j]=a[i];
40        }
41        //printf("%s\n%s\n",a,b);
42        printf("%d\n",n-LCS(n,n));
43    }
44    return 0;
45 }

 

posted on 2013-08-04 01:12  ok_boy  阅读(146)  评论(0)    收藏  举报

导航