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 }
View Code
原文地址:https://www.cnblogs.com/jihe/p/5743836.html