Programación Dinámica tipos clásicos de preguntas

Un problema

  • https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof/: preguntas cara 60: n un dado

 

 

 II. Solución

  • Programación Dinámica: con  DP [n] [j]  para expresar n dados  aparece el número j.

  • ecuación de transición de estados: n representa el número de puntos dados generados apareciendo j es igual a los dados se genera n-1 j - 1, j - 2, j - 3, j - 4, j - 5, J - 6, y el número de

  • Los pasos básicos: 1. En primer lugar, configurar los parámetros y los correspondientes significados de los parámetros, escritura dinámicamente transferir ecuación 2, 3 conjunto el valor inicial estado.

1. un código:

clase Solution {
 público : 
    vector < doble > twoSum ( int n) {
         int dp [15] [70 ]; 
        memset (dp, 0 , sizeof (dp));
        para ( int i = 1; i <= 6; i ++ ) { 
            dp [ 1] [i] = 1 ; 
        } 
        Para ( int i = 2; i <= n; i ++ ) {
             para ( int j = i; j <= 6 * i; j ++ ) {
                 para ( int cur = 1; cur <= 6; cur ++) {
                     Si (j - cur <= 0 ) {
                         descanso ; 
                    } 
                    Dp [i] [j] + = dp [i-1] [j- cur]; 
                } 
            } 
        } 
        Int all = pow (6 , n); 
        vector < doble > ret;
        para ( int i = n; i <= 6 * n; i ++ ) { 
            ret.push_back (dp [n] [i] * 1,0 / todos); 
        } 
        Devolver ret; 
    } 
};

2. Código de dos

  • Optimización de la matriz de dos dimensiones en una matriz unidimensional: es para modificar los valores de atrás hacia delante , frente a asegurar que el valor de unidimensional valor constante para obtener unidimensional

clase Solution {
 público : 
    vector < doble > twoSum ( int n) {
         int dp [70 ]; 
        memset (dp, 0 , sizeof (dp));
        para ( int i = 1; i <= 6; i ++ ) { 
            dp [i] = 1 ; 
        } 
        Para ( int i = 2; i <= n; i ++ ) {
             para ( int j = 6 * i; j> = i; j - ) { 
                dp [j] = 0 ;
                para ( intcur = 1; cur <= 6; cur ++ ) {
                     si (j - cur <i-1 ) {
                         descanso ; 
                    } 
                    Dp [J] + = dp [j- cur]; 
                } 
            } 
        } 
        Int all = pow (6 , n); 
        vector < doble > ret;
        para ( int i = n; i <= 6 * n; i ++ ) { 
            ret.push_back (dp [i] * 1,0 / todos); 
        } 
        Devolver ret; 
    } 
};

Tres ideas y código de:

Autor: huwt
enlace: https: //leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof/solution/nge-tou-zi-de-dian-shu-dong-tai-gui -hua-ji-qi-yo- 3 /

 

Supongo que te gusta

Origin www.cnblogs.com/zhihaospace/p/12571634.html
Recomendado
Clasificación