题意:将两个字符串合并2个字符串的字符顺序不变求最大回文串长度。
思路:DP【l1】【r1】【l2】【r2】表示,字符串a【l1】【r1】和b【l2】【r2】能否组成回文串。考虑四种状态,
若a[l1]==a[r1]则 dp[l1][r1][l2][r2]|=dp[l1+1][r1-1][l2][r2]
若a[l1]==b[r2]则 dp[l1][r1][l2][r2]|=dp[l1+1][r1][l2][r2-1]
若a[r1]==b[l2]则 dp[l1][r1][l2][r2]|=dp[l1][r1-1][l2+1][r2]
若b[l2]==b[r2]则 dp[l1][r1][l2][r2]|=dp[l1][r1][l2+1][r2-1]
#include <iostream> #include <algorithm> #include <cmath> #include <ctype.h> #include <cstring> #include <cstdio> #include <set> #include <sstream> #include<string> #include<queue> #include<stack> #include<map> #include<vector> #define MAXX 100005 #define SIS std::ios::sync_with_stdio(false) #define ll long long #define INF 0x3f3f3f3f //#include<bits/stdc++.h> using namespace std; const int MAX =1e6+5; const int mod=998244353; char a[100],b[100]; int dp[55][55][55][55]; int main() { SIS; int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp)); scanf("%s%s",a+1,b+1); int len1=strlen(a+1); int len2=strlen(b+1); int ans=0; for(int i=0;i<=len1;i++)///枚举a的长度 { for(int j=0;j<=len2;j++)///枚举b的长度 { for(int l1=1;l1+i-1<=len1;l1++)///a的左边界 { for(int l2=1;l2+j-1<=len2;l2++)///b的左边界 { int r1=i+l1-1;///a的右边界 int r2=j+l2-1;///b的右边界 if(i+j<=1) dp[l1][r1][l2][r2]=1;///初始化 else///四种状态 { if(i>1&&a[l1]==a[r1]) dp[l1][r1][l2][r2]|=dp[l1+1][r1-1][l2][r2]; if(i&&j&&a[l1]==b[r2]) dp[l1][r1][l2][r2]|=dp[l1+1][r1][l2][r2-1]; if(i&&j&&a[r1]==b[l2]) dp[l1][r1][l2][r2]|=dp[l1][r1-1][l2+1][r2]; if(j>1&&b[l2]==b[r2]) dp[l1][r1][l2][r2]|=dp[l1][r1][l2+1][r2-1]; } if(dp[l1][r1][l2][r2]) ans=max(ans,i+j); } } } } printf("%d\n",ans); } return 0; }