hdu 2089(数位dp)

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <cstdio>
 5 #include <string>
 6 #include <cmath>
 7 
 8 #define Faster ios::sync_with_stdio(false),cin.tie(0)
 9 #define Read freopen("in.txt","r",stdin),freopen("out.txt","w",stdout)
10 #define Close fclose(stdin),fclose(stdout)
11 const int maxn = 1e5 + 5;
12 using namespace std;
13 const int MOD = 1e9+7;
14 typedef long long ll;
15 int a[maxn];
16 int dp[maxn][2];
17 
18 int dfs(int pos, int pre, int sta, bool limit){
19     if(pos == -1) return 1;
20     if(!limit && dp[pos][sta] != -1) return dp[pos][sta];
21     int up = limit? a[pos]:9;
22     int tmp = 0;
23     for(int i = 0;i <= up;i++){
24         if(pre == 6 && i == 2)
25             continue;
26         if(i == 4)
27             continue;
28         tmp += dfs(pos-1, i, i == 6, limit && i == a[pos]);
29     }
30     if(!limit) dp[pos][sta] = tmp;
31     return tmp;
32 }
33 
34 //从 1到x 的满足的数量
35 int solve(int x){
36     int pos = 0;
37     while(x){
38         a[pos++] = x%10;
39         x /= 10;
40     }
41     return dfs(pos-1, -1, 0, true);
42 }
43 
44 int main(){
45     Faster;
46     int l, r;
47     while(cin >> l >> r){
48         if(l == 0 && r == 0)
49             break;
50         memset(dp, -1, sizeof dp);
51         int ans = solve(r) - solve(l-1);
52         cout << ans << endl;
53     }
54      return 0; 
55  }

猜你喜欢

转载自www.cnblogs.com/jaydenouyang/p/9092772.html