IOI2000

<问题分析>

将字符串与本身的反转字符串求最长公共子序列。

 1 #include <stdio.h>
 2 #include <string.h>
 3  
 4 int main()
 5 {
 6     char s[5001],r[5001];
 7     short v[2][5001];
 8     int i,j,n;
 9     scanf("%s",s);
10     strcpy(r,s);
11     strrev(r);
12     if(s[0]==r[0])
13     {
14        v[0][0]=1;
15     }
16     else
17     {
18        v[0][0]=0;
19     }
20     if(v[0][0]==1||s[0]==r[1])
21     {
22        v[0][1]=1;
23     }
24     else
25     {
26        v[0][1]=0;
27     }
28     if(v[0][0]||s[1]==r[0])
29     {
30        v[1][0]=1;
31     }
32     else
33     {
34        v[1][0]=0;
35     }
36     
37     for(i=1;i<strlen(s);i++)
38     {
39        for(j=1;j<strlen(r);j++)
40        {
41           if(s[i]==r[j])
42           {
43               v[i%2][j]=v[(i-1)%2][j-1]+1;
44           }
45           else if(v[(i-1)%2][j]>v[i%2][j-1])
46           {
47               v[i%2][j]=v[(i-1)%2][j];
48           }
49           else
50           {
51               v[i%2][j]=v[i%2][j-1];
52           }
53        } 
54     } 
55     printf("%d\n",strlen(s)-v[(i-1)%2][j-1]);
56     while(true);
57     return 0;
58 }

 

posted @ 2013-07-04 11:46  simplesslife  阅读(128)  评论(0编辑  收藏  举报