標籤:style blog class code c color
windy定義了一種windy數。
不含前置字元為零且相鄰兩個數字之差至少為2的正整數被稱為windy數。
windy想知道,在A和B之間,包括A和B,總共有多少個windy數?
Input
包含兩個整數,A B。
滿足 1 <= A <= B <= 2000000000 。
Output
包含一個整數:閉區間[A,B]上windy數的個數。
Sample Input
1 10
Sample Output
9
狀態分析比較簡單,需要加入前置0的狀態 如01 02 03
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <string>#include <algorithm>#include <queue>using namespace std;typedef long long ll;ll dp[20][10];vector<int> digit;int a,b;ll dfs(int pos,int statu,int done,int first){ if(pos==-1) return 1; if(!done && ~dp[pos][statu]&&!first) return dp[pos][statu]; ll res = 0; int end = done? digit[pos]:9; if(first){ for(int i = 0; i <= end; i++) res += dfs(pos-1,i,done&&i==end,i==0); } else{ for(int i = 0; i <= end; i++){ if(abs(i-statu)>=2) res += dfs(pos-1,i,done&&i==end,0); } } if(!done&&!first) dp[pos][statu] = res; return res;}ll solve(int num){ memset(dp,-1,sizeof dp); digit.clear(); while(num){ digit.push_back(num%10); num /= 10; } return dfs(digit.size()-1,0,1,1);}int main(){ while(cin >> a >> b){ cout<<solve(b)-solve(a-1)<<endl; } return 0;}