羅区P2657(デジタルDP)

###ロス・バレーP2657トピックリンク###

 

タイトル効果:あなたの番号[A、B]の範囲を与えるために、あなたはこの範囲内でお願いし、以下の条件を満たしたいくつかの数字があります。

1、2以上の隣接する2桁の数との差。

図2は、先行ゼロが含まれていません。

 

非常にシンプルなデジタルDPは、単に前、暴力に統計的な回答、ラインの後、メモリの番号の前に、先行ゼロのリードをマークしたいのですが、まだいくつかの場所少し気をつけて。

例えば、最初の桁(すなわち、非先頭ゼロ)に列挙に、それが現在数だけであるが、我々は、真のQ =を設定する必要があり(qは条件隣接ビットそのかどうか、現在の位置に列挙に前記しました差は2)に達しています。私は最初の重要なビットを列挙するときに、Q == falseを作ることができない、のための最初の桁に比べて差に二桁にその列挙を確保する必要があるときです。

そして、1が知ることができますサンプルによると、一桁も考慮されています。だから、最初の出会いのABS(I - 前)にするためには> = 2を、そして、我々は、私は、少なくともいずれかになりますので、スタートは、事前== -1することができようにする必要があります。

 

コードは以下の通りであります:

条件の数字を列挙するためによると

書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include < 文字列の.h>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
int型A、B;
INT [ 12 ]、DP [ 12 ] [ 12 ]。
LL DFS(int型 POS、INTプリ、ブール鉛、BOOL 限界){
     場合(POS == 0リターン 1 もし - (!!!限界&& &&リードDP [POS] [前] = 1のリターンDP [POS] [事前]。
    int型?=上限をアップ[POS]:9 ; 
    LLのRES = 0 以下のためにint型 iは= 0 ; iが<=最大、iは++ ){
         場合(リード&& I == 0)RES + = DFS(POS- 1、 - 1真の、限界が&& iは== [POS])を、
        {
             場合(ABS(I-PRE)> = 2 ){ 
                RES + = DFS(POS- 1、iは、偽の、限界が&& iは== [POS])を、
            } 
        } 
    } 
    もし(限界&&リード!)DP [POS] [事前] =のRES。
    リターンのres; 
} 
解決11(LLのX)
{ 
    int型の POS = 0 一方、(X){ 
        [ ++ POS] = X%10 
        X / = 10 
    } 
    戻り DFS(POS、 - 1真の真の); 
} 
int型のmain()
{ 
    // freopenは( "test.in"、 "R"、STDIN)。
//     freopenは( "test.outに"、 "W"、STDOUT)。
    memsetの(DP、 - 1はsizeof (DP))。
    同時に(〜のscanf(" %d個の%D "、およびA&B)){ 
    のprintf(" %のLLDを\ n "、(B)-solve(A-解決1 ))。
} 
}

 

正しいかどうかが決定されるQの値に応じて直接的に列挙。D DPは、状態qを保存する必要があります。

書式#include <iostreamの> 
の#include <アルゴリズム> 
書式#include < 文字列の.h>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
int型A、B;
INT [ 12 ]、DP [ 12 ] [ 12 ] [ 2 ]。
DFS(LL int型の POS、int型プリ、ブール Q、ブール鉛、ブール限界){
     場合(POSの== 0リターンQ。
    もし!(上限&& &&リードDP [POS] [前] [Q] = - !!1戻りDP [POS] [事前] [Q]。
    int型?=上限をアップ[POS]:9 ; 
    LLのRES = 0 以下のためにint型私= 0 ; I <=最大、iは++ ){
         場合(リード&& iは== 0)RES + = DFS(POS- 1、予め、qは、真の、限界が&& iは== [POS])を、
         RES + = DFS(POS- 1、I、Q &&(ABS(プレI)> = 2)、偽は、私は== &&限定[POS])を、
    } 
    であれば(限界&&リード!)DP [POS] [事前] [Q] =のRES。
    リターンのres; 
}
LL(LLのX)解決
{ 
    int型の POS = 0 一方、(X){ 
        [ ++ POS] = X%10 
        X / = 10 
    } 
    戻り DFS(POS、 - 1真の真の真の); 
} 
int型のmain()
{ 
    // freopenは( "test.in"、 "R"、STDIN)。
    // freopenは( "test.outに"、 "W"、STDOUT)。
    memsetの(DP、 - 1はsizeof (DP))。
    scanf関数(" %d個の%のD "、&​​A、&B);
    printf(" %LLDする\ n "、解決(B)-solve(A- 1 ))。
}

 

おすすめ

転載: www.cnblogs.com/Absofuckinglutely/p/11441584.html