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.
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 ; }