ABDELRHMAN_SAEED007

dp_digits

Nov 23rd, 2025
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | Source Code | 0 0
  1. using ll = long long;
  2. class Solution {
  3.  
  4. public:
  5.     ll dp[20][2][2][11][11];
  6.     string s1, s2;
  7.     string s;
  8.     int n;
  9.     ll digit(ll i, bool f, bool started, int prev1, int prev2) {
  10.         if (i == n)
  11.             return 0;
  12.         ll& ret = dp[i][f][started][prev1 + 1][prev2 + 1];
  13.         if (ret != -1)
  14.             return ret;
  15.         ll res = 0;
  16.         ll R = f ? 9 : (s[i] - '0');
  17.  
  18.         for (int dgt = 0; dgt <= R; dgt++) {
  19.  
  20.             bool nf = f || (dgt < (s[i] - '0'));
  21.             bool nstar = started || (dgt != 0);
  22.             int add = 0;
  23.             int np1, np2;
  24.             if (!nstar) {
  25.                 np1 = -1, np2 = -1;
  26.             } else if (!started && nstar) {
  27.                 np1 = -1;
  28.                 np2 = dgt;
  29.             } else {
  30.                 np1 = prev2;
  31.                 np2 = dgt;
  32.                 if (prev1 != -1 && prev2 != -1 && nstar) {
  33.                     if ((prev1 < prev2 && prev2 > dgt) ||
  34.                         (prev1 > prev2 && prev2 < dgt))
  35.                         add = 1;
  36.                 }
  37.             }
  38.  
  39.             res += add + digit(i + 1, nf, nstar, np1, np2);
  40.         }
  41.         return ret = res;
  42.     }
  43.  
  44.     ll calc(ll x) {
  45.         if (x <= 0)
  46.             return 0;
  47.         s = to_string(x);
  48.         n = s.size();
  49.         memset(dp, -1, sizeof(dp));
  50.         return digit(0, 0, 0, -1, -1);
  51.     }
  52.     long long totalWaviness(long long num1, long long num2) {
  53.  
  54.         return calc(num2) - calc(num1 - 1);
  55.     }
  56. };
Advertisement
Add Comment
Please, Sign In to add comment