POJ1159PalindromeLCS

    技术2026-04-20  4

    Problem Address:http://poj.org/problem?id=1159

     

    事实上是一道LCS,不过做了一点点修改而已。

     

    算是第一次打LCS,不过居然一次AC了,而且各种数据都还不赖。

     

    时间上虽然不是最好。

     

    思路就是将字符串反转过来,找出前后两个字符串的LCS,将字符串的长度减去LCS的值就得到答案。

     

    原来的LCS需要n*n的空间存储数据,由于不需要记录路径,所以我直接改成两个一维数组记录,节省了大量空间。

     

    搜了一下看到有人MLE的,庆幸= =

     

    以下贴代码:

     

    #include <iostream>using namespace std;int main(){ char s[5005],t[5005]; int d[5005],p[5005],n,i,j; scanf("%d", &n); scanf("%s", s); for (i=n-1,j=0; i>=0; i--,j++) {  t[j] = s[i]; } for (i=0; i<n; i++) {  d[i]=0;  p[i]=0; } for (i=0; i<n; i++) {  if (i%2==0)  {   if (t[i]==s[0]) d[0]=1>p[0]?1:p[0];   else d[0]=p[0];   for (j=1; j<n; j++)   {    if (t[i]==s[j])    {     d[j] = p[j-1]+1>p[j]?p[j-1]+1:p[j];    }    else    {     d[j] = d[j-1]>p[j]?d[j-1]:p[j];//这里可能是错的,可能是d[j]=0    }   }  }  else  {   if (t[i]==s[0]) p[0]=1>d[0]?1:d[0];   else p[0]=d[0];   for (j=1; j<n; j++)   {    if (t[i]==s[j])    {     p[j] = d[j-1]+1>d[j]?d[j-1]+1:d[j];    }    else    {     p[j] = p[j-1]>d[j]?p[j-1]:d[j];//这里可能是错的,可能是p[j]=0    }   }  } } printf("%d/n", n-(d[n-1]>p[n-1]?d[n-1]:p[n-1])); return 0;}

     

    加油加油!!!

    最新回复(0)