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

 

posted @ 2013-05-02 12:49  小仪在努力~  阅读(185)  评论(0编辑  收藏  举报