POJ 1159 Palindrome

地址:http://poj.org/problem?id=1159

题意:将给定的字符串补成回文串至少添加几个字符。

解法:

1.将此字符串倒置,与原字符串匹配,则:添加字符=字符串长度-匹配字符个数

2.如果DP开一个5000^2的静态数组是一定会超空间的,解决的办法是开一个二维滚动数组,这是这题的有一个关键。

PS:一开始怎么测都不行,想不到居然是把1写成了i,坑爹的细节错误啊,糟心!!!

#include<iostream>
#include<cstring>
#include<set>
using namespace std;


int maxlen[2][5005];

int main()
{
    int i,j,l;
    char *s1,*s2,t;
    while(cin>>l)
    {
        s1=new char[l];
        s2=new char[l];
        for(i=0;i<l;i++)
        {
          cin>>t;
          s2[l-i-1]=s1[i]=t;
        }
        int e=0;
        memset(maxlen,0,sizeof(maxlen));
        for(i=1;i<=l;i++)
        {
           e=1-e;
           for(j=1;j<=l;j++)
           {
              if(s1[i-1]==s2[j-1]) 
              maxlen[e][j]=maxlen[1-e][j-1]+1;
              else 
              {
                int len1=maxlen[1-e][j];
                int len2=maxlen[e][j-1];
                maxlen[e][j]=(len1<len2?len2:len1); 
              }
           }             
        }
        cout<<l-maxlen[e][l]<<endl;
        delete[] s1;
        delete[] s2;
    }
    return 0;
}


你可能感兴趣的:(POJ 1159 Palindrome)