http://acm.pku.edu.cn/JudgeOnline/problem?id=1159

tle的代码:
   #include 
< iostream >
#include 
< stdio.h >
using   namespace  std;
short  a[ 5010 ][ 5010 =   { 0 } ;
char  p[ 5010 ];
int  main()
{
    
int  l;
    
int  i, j , t, k  =   1 ;
    
while (scanf( " %d%s " , & l,p) != EOF)
    
{
        k 
=   1 ;
        
// 下面for语句产生l=5000的测试数据;
  /*        l = 5000;
        for(i = 0; i < 5000; i++)
            p[i] = 'b';
        p[0] = '1';
        p[i] = '\0';
        
*/

        
for (t  =   1 ; t  <  l; t ++ )
        
{
           
for (i  =   0 ;i < l - t;i ++ )
           
{
               j 
=  i  +  t;
               
if (p[i]  ==  p[j]) {
                    
// k++;
                   
// 把下面的换成k++对l=5000这组数据时间就不用那么多了,为什么啊?不都是一次运算么,运算时间不是相同的?
                   a[i][j]  =  a[i + 1 ][j - 1 ];
               }

               
else {
                    
if (a[i + 1 ][j] < a[i][j - 1 ])a[i][j] = a[i + 1 ][j] + 1 ;
                    
else  a[i][j] = a[i][j - 1 ] + 1 ;
               }


           }
;
        }
;
        printf(
" %d\n " , a[ 0 ][l - 1 ]);
    }

    
return   0 ;
}




ac的代码:
#include <stdio.h>
int main()
{
    
int a[2][5002]={0};
    
char p[5002];
    
char ch[5002];
    
int i,j,n,t;
    
int current;
    
int before;
    scanf(
"%d%s",&n,p+1);

        current
=1;
        before 
= 0;
        
for(i=1;i<=n;i++)
           ch[i]
=p[n-i+1];
           ch[i]
='\0';
     
//   printf("%s %s\n",p+1,ch+1);
        for(i=1;i<=n;i++)
        
{    for(j=1;j<=n;j++)
                
if(ch[i]==p[j])
                   a[current][j]
=a[before][j-1]+1;
                
else
                    
if(a[current][j-1]>=a[before][j])a[current][j]=a[current][j-1];
                    
else a[current][j]=a[before][j];
              t
=current;
              current
=before;
              before
=t;
        }

        printf(
"%d\n",n-a[t][n]);
    
return 0;
}