M4 - C-La crisis del perro espacial

tema

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

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

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;
}

Supongo que te gusta

Origin blog.csdn.net/alicemh/article/details/106604486
Recomendado
Clasificación