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 }