windy数
题意:区间内有多少任意两位差不小于2的
分析:任意两位差不小于2,那么要记录上一位选的是什么,还要注意上一位如果是前缀0的情况,再加一个标记,还要记录前面是否达到上限,然后就ok了
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=35; 4 5 int dp[maxn][maxn],d[maxn]; 6 7 int dfs(int len,int num,bool f,bool c){ 8 if(len<0)return 1; 9 int& tmp=dp[len][num]; 10 if(!f&&tmp!=-1)return tmp; 11 int ret=0,mx=!f?9:d[len]; 12 for(int i=0;i<=mx;i++){ 13 if(abs(i-num)<2)continue; 14 int a=i; 15 if(a==0&&c) a=11; 16 ret+=dfs(len-1,a,f&&i==mx,c&&i==0); 17 } 18 if(!f)tmp=ret; 19 return ret; 20 } 21 22 int solve(int x){ 23 int len=0; 24 while(x>0){ 25 d[len++]=x%10; 26 x/=10; 27 } 28 return dfs(len-1,11,1,1); 29 } 30 31 int main(){ 32 memset(dp,-1,sizeof(dp)); 33 int x,y; 34 while(cin>>x>>y) 35 cout<<solve(y)-solve(x-1)<<endl; 36 return 0; 37 }