Advertisement
pb_jiang

lc t4

Aug 14th, 2022
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1. class Solution {
  2.     vector<vector<int>> dp;
  3.     vector<int> digits;
  4.     int dcnt;
  5.    
  6.     int search(int pos, int limit, int lz, int state) {
  7.         // printf("in search pos:%d limit:%d lz:%d state:%d\n", pos, limit, lz, state);
  8.         if (pos == -1)  {
  9.             if (lz) return state <= 1 ? 0 : 1;
  10.             return state != 0;
  11.         }            
  12.         int ub = (limit ? digits[pos] : 9);
  13.         int ret = 0;
  14.         if (lz == 0 && limit == 0 && dp[pos][state] != -1) return dp[pos][state];
  15.         for (int i = 0; i <= ub; ++i) {
  16.             if (i == 0) {
  17.                 if (lz == 0) {
  18.                     if ((state & 0x01) == 0) {
  19.                         ret += search(pos - 1, 0, 0, state | 1);
  20.                     }
  21.                 } else {
  22.                     ret += search(pos - 1, 0, lz, state);
  23.                 }
  24.             } else {
  25.                 if (((1 << i) & state) == 0) {
  26.                     int li = search(pos - 1, limit && i == ub, 0, state | (1 << i));
  27.                     ret += li;
  28.                 }
  29.             }
  30.         }
  31.        
  32.         if (state == (1 << 4) + (1 << 0)) {
  33.             printf("limit:%d lz:%d ret:%d st:%d\n", limit, lz, ret, state);
  34.         }
  35.         if (lz == 0 && limit == 0) dp[pos][state] = ret;
  36.         return ret;
  37.     }
  38. public:
  39.     int countSpecialNumbers(int n) {
  40.         dp = vector<vector<int>>(1<<4, vector<int>(1 << 10, -1));
  41.         int nn = n;
  42.         dcnt = 0;
  43.         digits = vector<int>(16);
  44.         while(nn != 0) { digits[dcnt++] = nn % 10; nn /= 10; }
  45.         int ans = search(dcnt - 1, 1, 1, 0);
  46.         return ans;
  47.     }
  48. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement