まず、トピックを見て
風の強い風が強い数を定義します。先行ゼロなしで少なくとも2つの数値の差が正の整数で風と呼ばれているに隣接。
1-観察対象の種類を決定します
先行ゼロなしで二つの数字、観察されたデータの範囲に隣接している:キーワードがタイトルから引き出すことができ、100%のデータを満たす1 <= A <= B <= 2000000000。我々は明らかに、これは問題桁のDPテンプレートであることがわかります。
2-リリース状態遷移方程式
非常に明確な対象の条件は、我々が得ることができるので:我々は一次元のi番目のビットを表すために使用された2次元アレイを設定する必要があり、そして他の寸法は、ビット数で表されているが、J(0 <= jの<= 9)(我々は、動的プログラミングのアレイが答えと密接な関係だけでなく、被写体上の条件の巧妙な使用を有していなければならない移動したときに、転送の各段階の間に局所性を有していなければなりません。)
DPツリー機能:プレスビット処理機能、アドレス指定の問題は、一般に、より大きなデジタルデータの発行、及び各隣接ビット間のリンクです。DPと回答DPが部分的に完了した後、ツリーが直接することはできませんが、転送は、一般的には比較的簡単ですが、計算は非常に複雑な答えです。
(前処理は、DPを終了すると仮定して)計算3-解答
我々は唯一の1-nは、どのくらいの状況、比較的単純な計算となるよう間隔が、間隔上限の方法により算出したマイナス下界さを計算して、そのような練習の数は、通常、トラブルの多くので、範囲内の一定数を尋ねます。まず、我々はそれが先行ゼロなしで最初から開始することができないので、長さは、それは1~9すべてが、一定の上限よりも少ない数の上限よりも小さい蓄積することができるされているので、結果の数が上限LEN(の長さよりも短い計算します)(すべてを蓄積することができる)が、同じ長さ及び小の最も上限よりも最上位ビット位置の上限続い
LEN-1:最後には未定値の現在の位置を直接次に影響を与えるため、最も高いレベルと同じ数の上限と最も高いビット・コンピューティングは、決定されたので、我々はピークからプッシュダウンしなければならない程度であります1に、1からビット値の上限を列挙-1(なぜならビット数の上限に等しい数の列挙は、次のビットの値が回答を結合することができないので、疲れ限定される場合)各この蓄積のビット、および累積結果が算出された返します。
最終的な答えは、上限下限減算した結果です。
最後に、コード
#include<iostream>
#include<cstdio>
#include<math.h>
#include<cstring>
using namespace std;
int f[101][11]={0},n,m,a[11]={0};
void before(){
for(int i=0;i<=9;i++) f[1][i]=1;
for(int i=2;i<=32;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++) if(abs(j-k)>=2) f[i][j]+=f[i-1][k];
}
}
}
int solve(int num){
int ans=0,len=0;
memset(a,0,sizeof(a));
while(num) a[++len]=num%10,num/=10;
for(int i=1;i<=len-1;i++){ //长度小于len的都可以累加
for(int j=1;j<=9;j++) ans+=f[i][j];
}
for(int i=1;i<=a[len]-1;i++) ans+=f[len][i];//长度等于len但是最高位小于a[len]的可以累加
for(int i=len-1;i>=1;i--){
for(int j=0;j<=a[i]-1;j++){
if(abs(j-a[i+1])>=2) ans+=f[i][j]; //如果这个数和前一个数不合法则不累加
}
if(abs(a[i]-a[i+1])<2) break; //如果其中两数的值一定小于2,则没有长度为len最高位相同的情况
}
return ans;
}
int main()
{
before();
cin>>n>>m;
cout<<solve(m+1)-solve(n)<<endl;
}