Advertisement
pb_jiang

lc t4

Aug 14th, 2022 (edited)
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 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.         if (pos == -1)  {
  8.             if (lz) return state <= 1 ? 0 : 1;
  9.             return state != 0;
  10.         }            
  11.         int ub = (limit ? digits[pos] : 9);
  12.         int ret = 0;
  13.         if (pos == 1) printf("lz:%d, limit:%d ret:%d state:%d\n", lz, limit, ret, state);
  14.         if (lz == 0 && limit == 0 && dp[pos][state] != -1) return dp[pos][state];
  15.        
  16.         for (int i = 0; i <= ub; ++i) {
  17.             if (i == 0) {
  18.                 if (lz == 0) {
  19.                     if ((state & 0x01) == 0) {
  20.                         // int lz0 = search(pos - 1, 0, 0, state | 1); // wa
  21.                         int lz0 = search(pos - 1, limit && i == ub, 0, state | 1); // ac
  22.                         ret += lz0;
  23.                         if (pos == 1)
  24.                         printf("lz0:%d\n", lz0);
  25.                     }
  26.                 } else {
  27.                     int lz1 = search(pos - 1, 0, lz, state);
  28.                     ret += lz1;
  29.                     if (pos == 1)
  30.                     printf("lz1:%d\n", lz1);
  31.                 }
  32.             } else {
  33.                 if (((1 << i) & state) == 0) {
  34.                     int li = search(pos - 1, limit && i == ub, 0, state | (1 << i));
  35.                     if (pos == 1) {
  36.                         printf("li:%d\n", li);
  37.                     }
  38.                     ret += li;
  39.                 }
  40.             }
  41.         }
  42.        
  43.         // if (state == (1 << 4) + (1 << 0)) {
  44.         if (pos == 1) {
  45.             printf("limit:%d lz:%d ret:%d st:%d pos:%d\n", limit, lz, ret, state, pos);
  46.         }
  47.         if (lz == 0 && limit == 0) dp[pos][state] = ret;
  48.         return ret;
  49.     }
  50. public:
  51.     int countSpecialNumbers(int n) {
  52.         dp = vector<vector<int>>(1<<4, vector<int>(1 << 10, -1));
  53.         int nn = n;
  54.         dcnt = 0;
  55.         digits = vector<int>(16);
  56.         while(nn != 0) { digits[dcnt++] = nn % 10; nn /= 10; }
  57.         int ans = search(dcnt - 1, 1, 1, 0);
  58.         return ans;
  59.     }
  60. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement