Este artículo habla primero sobre: programación dinámica para resolver la longitud de cadena de palíndromo más larga
Sea f [i] [j]: indique si la subcadena representada por s [i] a s [j] es una cadena de palíndromo, es 1, es 0.
Según si s [i] y s [j] son iguales Partición
1.s [i] == s [j], entonces siempre que s [i + 1] a s [j-1] sea una subcadena de palíndromo, entonces s [i] a s [j] debe ser una subcadena de palíndromo. Si s [i + 1] a s [j-1] no es una subcadena de palíndromo, entonces s [i] a s [j] tampoco debe ser una subcadena de palíndromo
2.s [i]! = S [j] Entonces s [i] a s [j] no debe ser una subcadena de palíndromo
Ecuación de estado:
Volviendo a esta pregunta, porque esta pregunta es de 2 cadenas. Entonces ampliamos 2D a 4D
f [sa] [ea] [sb] [eb]: indica la longitud máxima de sa ~ ea y b sb ~ eb que puede constituir una subcadena de palíndromo
Ecuación de transferencia:
if(a[sa]==a[ea]) f[sa][ea][sb][eb]|=f[sa+1][ea-1][sb][eb];
if(b[sb]==b[eb]) f[sa][ea][sb][eb]|=f[sa][ea][sb+1][eb-1];
if(a[sa]==b[eb]) f[sa][ea][sb][eb]|=f[sa+1][ea][sb][eb-1];
if(a[ea]==b[sb]) f[sa][ea][sb][eb]|=f[sa][ea-1][sb+1][eb];
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int f[N][N][N][N];
int t;
char a[N],b[N];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s %s",(a+1),(b+1));
int ans=-1;
int lena=strlen(a+1);
int lenb=strlen(b+1);
for(int la=0;la<=lena;la++) //枚举a串的长度
for(int lb=0;lb<=lenb;lb++)//枚举b串的长度
{
for(int sa=1;sa+la-1<=lena;sa++) //枚举a串起点
{
for(int sb=1;sb+lb-1<=lenb;sb++)//枚举b串起点
{
int ea=sa+la-1;int eb=sb+lb-1;//a,b串终点
if(la+lb<=1) f[sa][ea][sb][eb]=1;//长度为1的串,初始化为1
else
{
f[sa][ea][sb][eb]=0;
if(a[sa]==a[ea]) f[sa][ea][sb][eb]|=f[sa+1][ea-1][sb][eb];
if(b[sb]==b[eb]) f[sa][ea][sb][eb]|=f[sa][ea][sb+1][eb-1];
if(a[sa]==b[eb]) f[sa][ea][sb][eb]|=f[sa+1][ea][sb][eb-1];
if(a[ea]==b[sb]) f[sa][ea][sb][eb]|=f[sa][ea-1][sb+1][eb];
}
//1表示是回文串,所以取长度la+lb
if(f[sa][ea][sb][eb]) ans=max(ans,la+lb);
}
}
}
cout<<ans<<endl;
}
}