Solution

看到数据范围可以想到区间

由题意可知字串是连续的。设 为在 中选取 ,在 中选取 是否能构成回文串。转移方程如下:

  • )
  • )
  • )

利用或运算可以方便的转移。当两个字符串最多选出一个字符时,此时显然有 ,作为边界条件。

时间复杂度:

Code

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,ans,dp[52][52][52][52];
string a,b;
int main(){
    cin>>n;
    int s,t;
    while(n--){
        memset(dp,0,sizeof(dp));
        ans=0;
        cin>>a>>b;
        s=a.size(),t=b.size();
        for(int x=0;x<=s;x++)
            for(int y=0;y<=t;y++)
                for(int i=1,j=x;j<=s;i++,j++)
                    for(int k=1,l=y;l<=t;k++,l++){
                        if(x+y<=1)
                            dp[i][j][k][l]=1;
                        else{
                            if(a[i-1]==a[j-1]&&x>1)
                                dp[i][j][k][l]|=dp[i+1][j-1][k][l];
                            if(b[k-1]==b[l-1]&&y>1)
                                dp[i][j][k][l]|=dp[i][j][k+1][l-1];
                            if(x&&y){
                                if(a[i-1]==b[l-1])
                                    dp[i][j][k][l]|=dp[i+1][j][k][l-1];
                                if(a[j-1]==b[k-1])
                                    dp[i][j][k][l]|=dp[i][j-1][k+1][l];
                            }
                        }
                        if(dp[i][j][k][l])
                            ans=max(ans,x+y);
                    }
        cout<<ans<<endl;
    }
    return 0;
}