Advertisement
pb_jiang

lc t4

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