tema
Ideas
Árbol de búsqueda binaria
Es un árbol vacío o un árbol binario con las siguientes propiedades: Si su subárbol izquierdo no está vacío, los valores de todos los nodos en el subárbol izquierdo son menores que el valor de su nodo raíz; si su subárbol derecho Si el árbol no está vacío, los valores de todos los nodos en el subárbol derecho son mayores que el valor de su nodo raíz; sus subárboles izquierdo y derecho también son árboles ordenados binarios.
El árbol de búsqueda binario debe ser binario y el árbol de búsqueda
Resolución de problemas
Usando la programación dinámica
f [i] [j] para registrar i a j, ¿se puede construir en un árbol de búsqueda binario?
Registre si el mcd entre cada dos números es mayor que 1
l [i] [j] representa un árbol legal con j como el siguiente, i, j como el subárbol izquierdo.
r [i] [j] es un árbol legal con i como raíz e i y j como subárbol derecho.
Enumere la longitud del intervalo len y el intervalo de la longitud en la matriz a su vez, y enumere el nodo raíz en el intervalo de esta longitud, la condición de transición es
l [q] [raíz] && r [raíz] [z], y al mismo tiempo en gcd2 [ q-1] [root], actualiza r [q-1] [z] y l [q] [z + 1] cuando gcd2 [root] [z + 1] es 1
Código
#include<iostream>
#include<string.h>
using namespace std;
int node[710];
int gcd(int a,int b){
return b == 0 ? a : gcd(b,a%b);}
bool f[710][710];
bool gcd2[710][710];
bool l[710][710],r[710][710];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(f,0,sizeof(f));
memset(gcd2, 0, sizeof(gcd2));
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>node[i];
l[i][i]=1;
r[i][i]=1;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i!=j && gcd(node[i], node[j]) > 1)
{
gcd2[i][j] = true;
}
}
}
for (int len = 0; len < n; len++)
{
for (int q = 1; q <= n-len; q++)
{
int z = q + len;
for (int root = q; root <= z; root++)
if (l[q][root] && r[root][z])
{
f[q][z] = 1;
if (gcd2[q - 1][root])
r[q - 1][z] = 1;
if (gcd2[root][z + 1])
l[q][z + 1] = 1;
}
}
}
if (f[1][n])
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}