solución recursiva problema de dos huevos

Durante la epidemia es ahora despidos pasivos, alojados en el dormitorio bien hacerlo, vi el video de un par de problema del huevo Lee maestro Ala-lok en YouTube, y es conocido como un problema de programación dinámica, y luego hacer un poco.

1. Descripción del problema:

Hay t-piso, n huevos, los huevos son el mismo, el piso crítica consiste lanzada desde la parte superior de un suelo, será roto, pero ser lanzados bajo el suelo, no será roto. No hay huevos rotos pueden ser reutilizados. Tratar de encontrar el menor número de hipótesis que necesitan suelo crítico de dumping.

2, el análisis cuestión, dibujo tabla.

eje horizontal Supongamos que representa el número de huevos, y el eje vertical es el número de plantas, se vierten número mínimo. El llenado de formularios.

El requisito aquí es encontrar el número del valor crítico de al menos objeto de dumping. Un aspecto que es la programación dinámica, directamente en forma recursiva.

M proporcionado (t, n) es un número mínimo de veces desde el piso t, siendo objeto de dumping necesitan n-número de huevos de, cómo muchas circunstancias. T es el tipo por supuesto, de cada capa lanzar un intento de huevo.

Ahora tenemos que conseguir un número mínimo de veces este t objeto de dumping objeto de dumping experimento. Número objeto de dumping proporcionado Mc (t, n) de la k (1 <= k <= t) uno huevos de piso tirado obtenidos se ensayaron. Este tipo de vertido t tienen una recurrencia patrones comunes:

K vierten en el supuesto de que la planta, dos situaciones:

Roto: la escala del problema se convierte en: M (k-1, n-1)

No se rompe: la escala del problema es: M (tk, n)

El Mk (t, n) = max (M (k-1, n-1), M (tk, n)) + 1, es decir, el número máximo determinado en este caso objeto de dumping.

而 M (t, n) = min (M1 (t, n), M2 (t, n), M3 (t, n) ...... Mc (t, n))

3, el código de prueba es:

public class Egg {
    private int t;//t层楼
    private int n;//n个鸡蛋
    private int[][] m;//最优解,在(i(楼层),j(鸡蛋))时候的最优解。最优解是指,一定能找到临界楼层情况下的最少抛投次数。

    private Egg(int t, int n) {
        this.t = t;
        this.n = n;
        this.m = new int[t + 1][n + 1];// 舍弃零行零列的数据不要
        for (int[] ints : this.m) {
            for (int anInt : ints) {
                anInt = Integer.MAX_VALUE;// 全部初始化为最大值
            }
        }
        // 填充1行1列的简单数据
        for (int i = 1; i < t + 1; i++) {
            m[i][1] = i;//一层楼的话,至少试一次
        }
        for (int j = 1; j < n + 1; j++) {
            m[1][j] = 1;//一个鸡蛋的话,要试的次数为楼层数
        }
    }

    public int result() {//填充大于1行1列的空格
        for (int tt = 2; tt < t + 1; tt++) {//从第二层楼开始
            for (int nn = 2; nn < n + 1; nn++) {//从有两个鸡蛋开始
                int min = Integer.MAX_VALUE;
                for (int k = 1; k < t + 1 && tt > k; k++) {//第一次从k层楼抛切分
                    min = Math.min(min, Math.max(m[tt - k][nn], m[k - 1][nn - 1]) + 1);
                    // 如果失败,问题变为m[k-1][n-1],如果成功,问题变为m[t-k][n],现在每一层都切分一次,然后找到每一层切分需要的最大值。
                    // 然后从每层楼中取最小值,这里要注意我们求的是什么:保证一定能找到临界楼层的最小抛投次数。
                }
                m[tt][nn] = min;
            }
        }
        return m[t][n];
    }


    public static void main(String[] args) {

        for (int i = 1; i < 26; i++) {
            System.out.print(i + " floors\t");
            for (int j = 1; j < 11; j++) {
                System.out.print(new Egg(i, j).result() + "\t");
            }
            System.out.println();
        }
    }
}

4, los resultados muestran:

La respuesta correcta es:

Es lo mismo. respuesta correcta

Publicado 29 artículos originales · ganado elogios 2 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/u012803274/article/details/104824421
Recomendado
Clasificación