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 }