poj 1159 Palindrome NYOJ 37 回文字符串(DP)

这道题有两种解法:

第一种:求s~sLCS,然后套用公式length-LCS长度 即为所求。

第二种:直接DP求解。

s[i] == s[j]  f[i][j]=f[i+1][j-1]

  s[i] != s[j]  f[i][j]=min(f[i+1][j],f[i][j-1])+1;

 

这个题我用的是一个大型的二维数组,代码很水,不建议欣赏。

 

#include<iostream>
#include< string>
#include<cstring>
#include<cstdio>
using  namespace std;
const  int MAXM=1001;
short  int  f[MAXM][MAXM];
char s[1001];
int LCS()
{

    scanf("%s",s);
    memset(f,0, sizeof(f));
     int len=strlen(s);
     for( int i=0;i<len;++i)
    {
         for( int j=i;j>=0;--j)
        {
             if(s[i]==s[j])
            {
                f[i+1][j+1]=f[i][j+2];
            }
             else
            {
                f[i+1][j+1]=min(f[i][j+1],f[i+1][j+2])+1;
            }
        }
    }
     return f[len][1];
}

int main()
{
     int n;

    cin>>n;
     while(n--)
    {
        printf("%d\n",LCS());
    }


     return 0;
}
                

你可能感兴趣的:(poj 1159 Palindrome NYOJ 37 回文字符串(DP))