UESTC 1307 windy数

解法:

  不含前导0,那么最开始dfs的时候可以把最高位之前那位设为11,这样的话最高位的数选取不受限制,还要注意的就是枚举到当前位的时候数是不是已经大于0。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define N 20
 6 using namespace std;
 7 typedef long long ll;
 8 ll dp[N][N];
 9 int bit[N];
10 ll dfs(int pos,int st,int pred,int flag){
11     if(pos==0)return st==1;
12     if(flag&&~dp[pos][pred]&&st)return dp[pos][pred];
13     int u=flag?9:bit[pos];
14     ll ans=0;
15     for(int d=0;d<=u;d++){
16         if(!st||pred-d>=2||d-pred>=2)
17             ans+=dfs(pos-1,st||d>0,d,flag||d<u);
18     }
19     if(flag&&st)dp[pos][pred]=ans;
20     return ans;
21 }
22 ll solve(ll n){
23     int len=0;
24     while(n){
25         bit[++len]=n%10;
26         n/=10;
27     }
28     return dfs(len,0,11,0);
29 }
30 int main(){
31     ll a,b;
32     memset(dp,-1,sizeof(dp));
33     while(cin>>a>>b){
34         cout<<solve(b)-solve(a-1)<<endl;
35     }
36     return 0;
37 }

 

posted @ 2013-03-09 14:49  silver__bullet  阅读(618)  评论(0编辑  收藏  举报