题目链接.
d p [ l 1 ] [ r 1 ] [ l 2 ] [ r 2 ] dp[l1][r1][l2][r2] dp[l1][r1][l2][r2]表示字符串 s 1 s1 s1的 l 1 − r 1 l1-r1 l1−r1和字符串 s 2 s2 s2的 l 2 − r 2 l2-r2 l2−r2能否组成回文串。
对于 d p [ l 1 ] [ r 1 ] [ l 2 ] [ r 2 ] dp[l1][r1][l2][r2] dp[l1][r1][l2][r2]共有四种可能的转移:
d p [ l 1 + 1 ] [ r 1 − 1 ] [ l 2 ] [ r 2 ] ; dp[l1+1][r1-1][l2][r2]; dp[l1+1][r1−1][l2][r2];
d p [ l 1 + 1 ] [ r 1 ] [ l 2 ] [ r 2 − 1 ] ; dp[l1+1][r1][l2][r2-1]; dp[l1+1][r1][l2][r2−1];
d p [ l 1 ] [ r 1 − 1 ] [ l 2 + 1 ] [ r 2 ] ; dp[l1][r1-1][l2+1][r2]; dp[l1][r1−1][l2+1][r2];
d p [ l 1 ] [ r 1 ] [ l 2 + 1 ] [ r 2 − 1 ] ; dp[l1][r1][l2+1][r2-1]; dp[l1][r1][l2+1][r2−1];
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=10010;
char s1[55],s2[55];
bool dp[55][55][55][55];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int t;cin>>t;
while(t--)
{
cin>>s1+1>>s2+1;
int n1=strlen(s1+1);
int n2=strlen(s2+1);
int ans=1;
for(int len1=0;len1<=n1;len1++)
{
for(int len2=0;len2<=n2;len2++)
{
for(int l1=1,r1=l1+len1-1;r1<=n1;l1++,r1++)
{
for(int l2=1,r2=l2+len2-1;r2<=n2;l2++,r2++)
{
dp[l1][r1][l2][r2]=0;
bool &v=dp[l1][r1][l2][r2];
if(len1+len2<=1)v=1;
else
{
if(s1[l1]==s1[r1]&&r1>0)v|=dp[l1+1][r1-1][l2][r2];
if(s1[l1]==s2[r2]&&r2>0)v|=dp[l1+1][r1][l2][r2-1];
if(s2[l2]==s1[r1]&&r1>0)v|=dp[l1][r1-1][l2+1][r2];
if(s2[l2]==s2[r2]&&r2>0)v|=dp[l1][r1][l2+1][r2-1];
}
//该序列可以组成回文串
if(v)ans=max(ans,r1-l1+r2-l2+2);
}
}
}
}
cout<<ans<<"\n";
}
return 0;
}