ベアデジタルDP
この問題の面で少なくとも2の要件に隣接する2つの数字の違いを見て、私たちは最後のビットの現在のレコード番号を記入
アカウントに先頭の0がんを取ります。塗りつぶしの前の数字が0の場合、0はこの1つは合法である埋めます。
emmmを参照するには、特定のコードのペア
#include <iostreamの> する#include <キュー> の#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> する#include <cmath> の#define PA対<整数、整数> のtypedef 長い 長LL。 使用して 名前空間はstdを、 const int型 INF = 214748364 ; インラインLLリード() { チャー CH = GETCHAR()。 LL、X = 0。BOOL F = 0 。 一方、(CH < ' 0 ' || CH> ' 9 ' ) { もし(CH == ' - ')、F = 1 。 CH = GETCHAR()。 } 一方、(CH> = ' 0 ' && CH <= ' 9 ' ) { X =(x << 3)+(X << 1)+(CH ^ 48 )。 CH = GETCHAR()。 } リターン?F - X:X; } LL、B、F [ 15 ] [ 10 ]、リチウム[ 15 ]、T; // のLi [i]はi番目の時の先頭セクタが最大数で表し ボイドミリアンペア(R&LT LL) { T = 0 。 memset(LI、0、はsizeof (LI))。 一方、(R) { リチウム[ ++ T] = Rの%10 。 R / = 10 。 } } ゾルLL(int型、今int型 LST、BOOLリム、BOOLのAl)を// 今最初の場所内のエントリの今、LSTは、充填の数字であり、LIMは、上部境界かどうかを示し、Alはフロントが0であるか否かを示す { IF(今== 0)リターン 1 ; IF - (アルリム&& && F [今] [LST] =!1)リターン[今] [LST] F; int型 =リムのLi [今] :?アップ9 。 LL RTN = 0 。 以下のために(int型私= 0私は++;;私は<=アップ) { もし((ABS(LST-I)< 2)&&アル!)続けます。 RTN + =ゾル(NOW- 1、I、(LIM &&(I ==アップ))、((I == 0)&& AL))。 } もし [今] [LST] = F(AL && LIM!)RTN。 リターンRTN。 } int型のmain() { memsetの(F、 - 1、はsizeof (F))。= READ(); B = 読み取ります()。 ミリアンペア(B); // 最初のペア[1、B再び係合 LLをANSソル=(T、0、1、1 ); ミリアンペア(A - 1); // 再度[1、-1]再び係合 LLソルAN =(T、0、1、1 ); 年 - = 年。 printf(" %dの" 、ANS)。 }