NYOJ_37_回文字符串

首先,我们把字符串反转,然后用反串和原串求最大公共子序列,再用字符串长度减去最大公共子序列的长度就是答案,我们还可以用滚动数组优化内存

状态转移方程:

(i长度的a串和j长度的b串的最长公共子序列长度)

             1.dp[i-1][j-1]+1     a[i]=b[j]

dp[i][j]=

             2.max(dp[i][j-1],dp[i-1][j])     a[i]!=b[j]

#include<iostream>

#include<cstdio>

#include<algorithm>

#include<cmath>

#include<cstring>

#include<string>

using namespace std;

int re[2][1005];//使用滚动数组优化了空间

int main()

{

 int t,i,j;

 string a,b;

 scanf("%d",&t);

 while(t--)

 {

     cin>>a;

     b=a;

     reverse(a.begin(),a.end());

     memset(re,0,sizeof(re));

     for(i=0;i<a.length();++i)

         for(j=0;j<b.length();++j)

         {

         if(a[i]==b[j])

         {

             re[(i+1)&1][j+1]=re[i&1][j]+1;

         }

         else re[(i+1)&1][j+1]=re[i&1][j+1]>re[(i+1)&1][j]?re[i&1][j+1]:re[(i+1)&1][j];//条件表达式是最省时间的

         }

         printf("%d\n",a.length()-re[(a.length())&1][b.length()]);

 }



 return 0;

}

 

你可能感兴趣的:(字符串)