现在的位置: 首页 > 综合 > 正文

POJ1159 Palindrome LCS

2013年05月26日 ⁄ 综合 ⁄ 共 997字 ⁄ 字号 评论关闭

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;
}

 

加油加油!!!

抱歉!评论已关闭.