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