CodeTyper

CSES: Counting Numbers - Digit Dynamic Programming

Feb 26th, 2021 (edited)
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.42 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. #define boost ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
  4. #define Bye return 0
  5. #define CodeTyper main
  6. #define ll int long long
  7.  
  8. using namespace std;
  9.  
  10. ll dp[20][2][10][2];
  11.  
  12. ll digit_dp(int pos, int flag, int previous, bool zero, string str){
  13.     if(pos >= str.size())
  14.         return 1;
  15.  
  16.     if(dp[pos][flag][previous][zero] != -1)
  17.         return dp[pos][flag][previous][zero];
  18.  
  19.     ll res = 0;
  20.     if(zero)
  21.         res = digit_dp(pos + 1, 0, 0, 1, str);
  22.     else
  23.         if(previous != 0)
  24.             res = digit_dp(pos + 1, (str[pos] - '0' == 0) ? flag : 0, 0, 0, str);
  25.    
  26.     int end = flag ? str[pos] - '0' : 9;
  27.     for (int j = 1; j<=end; j++){
  28.         if(previous == j)
  29.             continue;
  30.        
  31.         int new_flag = (j == str[pos] - '0') ? flag : 0;
  32.         res += digit_dp(pos + 1, new_flag, j, false, str);
  33.     }
  34.  
  35.     return dp[pos][flag][previous][zero] = res;
  36. }
  37.  
  38. void reset_dp(){
  39.     memset(dp, -1, sizeof dp);
  40. }
  41.  
  42.  
  43. void solve() {
  44.     ll a, b; cin>>a>>b; a--;
  45.     string str_b = to_string(b);
  46.     string str_a = to_string(a);
  47.  
  48.     reset_dp();
  49.     ll r = digit_dp(0, true, -1, true, str_b);
  50.     reset_dp();
  51.     ll l = digit_dp(0, true, -1, true, str_a);
  52.  
  53.     l = a < 0 ? 0 : l;
  54.  
  55.     cout<<(r - l)<<endl;
  56. }
  57.  
  58. int CodeTyper()
  59. {
  60.     boost;
  61.     solve();
  62.     Bye;
  63. }
  64.  
  65. /*
  66.     'Think FIRST, then CODE.'
  67.     'May the CODE be with YOU.'
  68. */
Add Comment
Please, Sign In to add comment