Fusionar subcadenas de palíndromo ------------------------------------ pensamiento (intervalo dp para el carácter de palíndromo más largo Cadena)

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

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:

Inserte la descripción de la imagen aquí

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;
	 } 
}
572 artículos originales publicados · elogiados 14 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43690454/article/details/105282586
Recomendado
Clasificación