N - F (x) HDU - 4734

N - F (x)

HDU - 4734

http://acm.hdu.edu.cn/showproblem.php?pid=4734

Descripción Asunto:

Dentro 0 ~ B, F (b) <= F (A) tiene un número.

F (x) = A * n 2 n-1 + A n-1 * 2 n-2 + ... + A 2 * 2 + A 1 * 1. * Cada número corresponde a n-ésima potencia de 2, y .

análisis:

dp digital. dp [pos] [r] indica el primer pos dígitos, r para el número máximo de F (A) - y satisfactorio.

En primer lugar buscar la máxima F (A), cada uno empujado a uno, con F (A) - el producto del número de bits correspondiente al significado de las preguntas, se obtiene es r.

Si r <0 significa que F (b)> F (A), y termina directamente.

memset (dp, -1, dp sizeof) para ser colocado en frente de los soportes, o va T.

código:

#include <vector>  
#include <algoritmo> 
#include <cstring> 
#include <iostream> 
#include <cmath>
 usando  espacio de nombres std; 
typedef largo  largo ll;
const  int maxN = 1E4;
int F; // 上界
int dp [ 15 ] [maxN];
int a [ 20 ];
int pow2 [ 20 ];
int dfs ( int POS, int r, bool límite) 
{ 
    si (pos == -1 ) de retorno r> = 0 ;
    si (r < 0 ) de retorno  0 ;
    si (límite && dp [pos] [r] = -! 1 ) de retorno dp [pos] [r];
    int arriba = límite A [pos]:? 9 ;
    int ans = 0 ;
    para ( int i = 0 ; i <= hasta; i ++ ) 
    { 
        si (r <i * pow2 [pos]) descanso ; 
        ans + = dfs (posi- 1 , * ri pow2 [pos], límite && i == un [pos]); 
    } 
    si(! límite) dp [pos] [r] = ans;
    volver ans; 
} 
Int resolver ( int x) 
{ 
    int pos = 0 ;
    mientras que (x) 
    { 
        A [pos ++] = x% 10 ; 
        x / = 10 ; 
    } 
    De retorno dfs (posi- 1 , F, 1 ); 
} 
Int main () 
{ 
    pow2 [ 0 ] = 1 ;
    para ( int i = 1 ; i <= 15 ; i ++) 
    { 
        Pow2 [i] = pow2 [i- 1 ] * 2 ; 
    } 
    Int T; scanf ( " % d " , y T); 
    memset (dp, - 1 , sizeof dp);
    para ( int i = 1 ; i <= T; i ++ ) 
    { 
        int A, B; 
        scanf ( " % d% d " , & A, y B); 
        
        F = 0 ;
        int k = 0 ;
        mientras que (A) 
        { 
            F+ = (A% 10 ) * pow2 [k]; 
            A / = 10 , k ++ ; 
        } 
        Printf ( " Caso #% d:% d \ n " , i, resuelvo (B)); 
    } 
    Volver  0 ; 
}
 

 

Supongo que te gusta

Origin www.cnblogs.com/studyshare777/p/12484069.html
Recomendado
Clasificación