Palindrome[1159@pku]

Palindrome[1159@pku]

// @pku DY问题
// 最重要的是要找到重叠子问题,本题用LCS的方法是错误的
// 本题最大的问题是flag数组太大,用int会MLE,改用short可以勉强通过
// 感觉每次用备忘录的方法时内存的开销都是一个很大的问题
#include<iostream>
#include<algorithm>
#include< string>
#include<cstring>
using  namespace std;

#define N 5010
short flag[N][N];
string s;
int dp( int low, int high);
int main()
{
     int n;
     while(cin>>n){
         int cn=0;
        cin>>s;
        memset(flag,-1, sizeof(flag));

        cn=dp(0,n-1);
        cout<<cn<<endl;
    } // end while
     return 0;
}


int dp( int low, int high)
{
     if(low>=high)
         return 0;
     else
    {
         if(flag[low][high]!=-1)
             return flag[low][high];

         else
        {
             if(s[low]==s[high])
                 return flag[low+1][high-1]=dp(low+1,high-1);
             else
            {
                flag[low+1][high]=dp(low+1, high);
                flag[low][high-1]=dp(low, high-1);
                 return flag[low][high]=1+min(flag[low+1][high],flag[low][high-1]);
            }
        }
    }
}

你可能感兴趣的:(Palindrome[1159@pku])