「問題の解決」:風の数

質問:風の強い数

制限時間:1秒   メモリ制限:512メガバイト

フェイス質問


タイトル説明

これはウィンディウィンディの数を定義:先行ゼロがなく、二つの数間の少なくとも違いに隣接

正の整数の数がウィンディと呼ばれています。

ウィンディはAで、知りたいとB 、Aを含む、間及びB、どのように多くのウィンディ数の合計?

入力形式

2つのライン数、それぞれ、A、B

出力フォーマット

出力答えを表す整数。

サンプル入力

1 10

サンプル出力

9

問題の解決策


私のデジタルDPエントリーのタイトル、ああ、実際には、非常に簡単。

[I] [j]はiのビットを埋める意味セットF、最大数は、風、jのビット数です。

だから、神が直接、少なくとも2つの問題の一時的な位置ずれを考慮して、激しくすべての値を計算し、DP問題のパイロット0をかれらかを検討していません。

そして、それは再び精力的に1-9サイクルからjはそれに答える蓄積し、DPありません。

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <cmath>
 に#define int型、長い長い
 #defineし RINTが登録int型
 の#define LL長い長い
 使って 名前空間はstd;
INT [F 20 ] [ 15 ] = { 0 }、B。
LL PW [ 15 ]。
ボイドprework()
{ 
    PWは[ 0 ] = 1 ため(RINT i = 1 ; iが= < 12 ; ++ I)PW [I] = PW [I- 1 ] * 10 (RINT I = 0 ; I <= 9 ; I ++は)のF [ 1 ] [I] = 1 ;
     のための(I = RINT 2 ; I <= 11 ; Iは++)// 列挙ビット
        (RINT = J 0、J <= 9。 ; J ++)// 列挙最高
            のための(RINT K = 0 ; K <= 9は、K ++)// 状態列挙の最上位ビットを、ビューこの状態高い
                IF(ABS(JK)> = 2)F [I] [J] + = F [I- 1 ] [K]; 
} 
int型の COUNT(INT X)
{ 
    int値 W = 0、Y、ANS =0 、事前;
    一方、(PW [W] <= X)++ W。// 求位数
    ため(RINT i = 1 ; iはW <; ++ I)// 枚举位数
        ため(RINTのJ = 1 ; J <= 9 ; ++ j)は// 枚举最高位 
            ANS + = F [i]は[J]。
    Y = X / PW [W- 1 ]。
    ため(RINT i = 1 ; iがyと<; ++ I)ANS + = F [W] [I]。
    予備 = Y。
    X%= PW [W- 1 ]。
    (RINT I = W- 1 ; I> = 1 - ; I)
    { 
        Y= X / PW [I- 1 ]。
        (RINTのJ = 0 ; J <Y; ++ j)の
             場合(ABS(J-PRE)> = 2 
                ANS + = F [I] [J]。
        もし(ABS(プレY)< 2ブレーク
        予備 = Y。
        X%= PW [I- 1 ]。
    } 
    戻りANS。
} 
()主符号付き
{ 
    scanf関数(" %のLLDの%のLLD "、&​​A、&B); 
    prework(); 
    coutの <<回数(B + 1)-count(A)<< ENDL。
    リターン 0 ; 
}
コードの表示

おすすめ

転載: www.cnblogs.com/xingmi-weiyouni/p/11311352.html