Dinâmica de programação tipos clássicos de perguntas

Um problema

  • https://leetcode-cn.com/problems/nge-tou-zi-de-dian-shu-lcof/: questões de face 60: n um dado

 

 

 II. Solution

  • A programação dinâmica: com  DP [n] [j]  a expressar n dice  aparece número j.

  • equação de transição de estado: n representa o número de pontos de dados gerados aparecendo j é igual ao dice n-1 é gerado j - 1, J - 2, J - 3, J - 4, J - 5, J - 6, e o número de

  • Os passos básicos: 1. Primeiro, configurar parâmetros e correspondentes significados dos parâmetros, escreva dinamicamente transferir equação 2, 3 set o valor do estado inicial.

1. um Código:

classe Solution {
 público : 
    vector < double > 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 ++) {
                     Se (j - cur <= 0 ) {
                         ruptura ; 
                    } 
                    Dp [i] [j] + = dp [I-1] [j- cur]; 
                } 
            } 
        } 
        Int tudo = POW (6 , n); 
        vector < double > ret;
        para ( int i = n; i <= 6 * n; i ++ ) { 
            ret.push_back (dp [n] [i] * 1.0 / tudo); 
        } 
        Retornar ret; 
    } 
};

2. Código de dois

  • Optimização da matriz bidimensional em uma matriz unidimensional: é para modificar os valores de trás para a frente , da frente para assegurar que o valor de unidimensional valor constante para obter unidimensional

classe Solution {
 público : 
    vector < double > 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 ++ ) {
                     se (j - cur <i-1 ) {
                         ruptura ; 
                    } 
                    Dp [j] + = dp [j- cur]; 
                } 
            } 
        } 
        Int tudo = POW (6 , n); 
        vector < double > ret;
        para ( int i = n; i <= 6 * n; i ++ ) { 
            ret.push_back (dp [i] * 1.0 / tudo); 
        } 
        Retornar ret; 
    } 
};

Três idéias e código de:

Autor: huwt
link: 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 /

 

Acho que você gosta

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