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;
} 
京公网安备 11010502036488号