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

 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
",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
",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
%s
",a,b);
42        printf("%d
",n-LCS(n,n));
43    }
44    return 0;
45 }
原文地址:https://www.cnblogs.com/okboy/p/3235853.html