Iterativo profundización de búsqueda -POJ 3134 Potencia de Cálculo

Iterativo de búsqueda profundización

¿Qué es la búsqueda de profundización iterativa?
Iterativo de búsqueda profundización (iterativo profundización de DFS, IDDFS) método de búsqueda es una combinación de DFS y BFS pensaban. Cuando el árbol de búsqueda profunda y ancha, cuando, con DFS caerá en un no recursivo para volver, con el espacio de cola BFS va a explotar, puede intentar IDDFS, en pocas palabras, es la búsqueda DFS capa k, si no se encuentra inmediatamente devuelto solución factible a continuación, la búsqueda DFS k + 1 capa, hasta que encuentre una solución factible, utilizando idea de BFS en el número de capas de ampliar gradualmente la profundidad de la búsqueda de la DFS.

IDA *
función de valoración para optimizar la búsqueda de profundización iterativa, que la poda estimación optimista. Cuando encuentre el menor número de capas + niveles actuales> limitar el número de capas necesarias, solución de salida.

ejemplo

Portal: POJ-3134

A partir de x y multiplicando varias veces por x, podemos calcular x31 con treinta y multiplicaciones:
x2 = x x x, x3 = x2 × x, x4 = x3 × x, ..., x31 = x30 x x.
La operación de elevación al cuadrado se puede acortar sensiblemente la secuencia de multiplicaciones. La siguiente es una manera de x31 de cómputo con ocho multiplicaciones:
x2 = x x x, x3 = x2 × x, x6 = x3 × x3, x7 = x6 × x, x14 = x7 × x7, x15 = x14 × x, x30 = x15 × x15, x31 = x30 × x.
Esta no es la secuencia más corta de multiplicaciones a x31 de cómputo. Hay muchas maneras con sólo siete multiplicaciones. El siguiente es uno de ellos:
x2 = x x x, x4 = x2 × x2, x8 = x4 × x4, x8 = x4 × x4, x10 = x8 × x2, x20 = x10 × x10, x30 = x20 × x10, x31 = x30 × x.
Si la división también está disponible, podemos encontrar una secuencia aún más corta de las operaciones. Es posible calcular x31 con seis operaciones (cinco multiplicaciones y una división):
x2 = x x x, x4 = x2 × x2, x8 = x4 × x4, x16 = x8 × x8, x32 = x16 × x16, x31 = x32 ÷ x.
Esta es una de las formas más eficientes para x31 de cómputo si una división es tan rápido como una multiplicación.
Su misión es la de escribir un programa para encontrar el menor número de operaciones para calcular x n por la multiplicación y división a partir de x para el dado entero positivo n. Productos y cocientes que aparecen en la secuencia debe ser x al poder de un número entero positivo. En otras palabras, x-3, por ejemplo, en caso de no aparecer.

entrada:

La entrada es una secuencia de una o más líneas que contienen cada uno un solo número entero n. n es positivo y menor que o igual a 1000. El final de la entrada se indica con un cero.

salida:

Su programa debe imprimir el menor número total de multiplicaciones y divisiones se requiere para calcular x n a partir de x para el entero n. Los números deben ser escritos cada uno en una línea separada sin ningún carácter superfluos tales como espacios iniciales o finales.

Ejemplo de entrada:

1
31
70
91
473
512
811
953
0

Salida de muestra:

0
6
8
9
11
9
13
12

El significado de los problemas

Teniendo en cuenta el número de x y n, x buscan el n- , sólo con la multiplicación y la división, se cuentan los resultados pueden ser utilizados, al menos conde le preguntó ¿cuántas veces?

análisis

1 comienza desde el equivalente digital, con la suma y la resta, mínimo n-contar el número de veces para dar?
, Y los valores generados anteriormente se obtuvieron mediante el cálculo del nuevo valor del valor corriente de aceleración, se determina si o igual a n.
función de valoración: Si el valor actual es la manera más rápida (incluso multiplicado por 2) n no puede llegar a la salida.

código

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn = 1010;
int a[maxn];
int n, k;
bool ida(int now,int curk) {
	if (curk > k)return true;//当前层数大于层数限制
	//剩下的层数(层数限制-当前层)用最乐观的倍增也不能达到n
	if (now << (k - curk) < n)return true;
	return false;
}
bool iddfs(int now, int curk) {
	if (ida(now, curk))return false;
	if (now == n)return true;
	a[curk] = now;
	for (int i = 0; i <= curk; i++) {//遍历之前算过的值
		//加
		if (iddfs(now + a[i], curk + 1))return true;
		//减
		else if (iddfs(abs(now - a[i]), curk + 1))return true;
	}
	return false;
}
int main() {
	while (~scanf("%d", &n) && n) {
		for (k = 0;; k++) {//每次最大搜索k层
			memset(a, 0, sizeof(a));
			if (iddfs(1, 0))break;//从数字1开始,当前层0
		}
		printf("%d\n", k);
	}
	return 0;
}

resumen

  1. complejidad espacio y la misma búsqueda de profundidad, tiempo de búsqueda complejidad es algo inferior al ancho (de hecho, la capa frontal k-1 para la complejidad de los residuos puede ser ignorada).
  2. Adecuado para bastante tiempo, menos espacio, no hay límite superior clara de la profundidad del tema de búsqueda.
  3. La poda !!!

Sus pulgares será mi mayor motivación

Publicado siete artículos originales · ganado elogios 19 · vistas 2450

Supongo que te gusta

Origin blog.csdn.net/qq_45034708/article/details/105209951
Recomendado
Clasificación