-
Notifications
You must be signed in to change notification settings - Fork 181
/
Copy pathdigit_dp.cpp
64 lines (47 loc) · 1.07 KB
/
digit_dp.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "bits/stdc++.h"
using namespace std;
long long dp[20][180][2];
long long getDigits(long long x, vector <int> &digit)
{
while (x)
{
digit.push_back(x%10);
x /= 10;
}
}
long long digitSum(int idx, int sum, int tight,
vector <int> &digit)
{
if (idx == -1)
return sum;
if (dp[idx][sum][tight] != -1 and tight != 1)
return dp[idx][sum][tight];
long long ret = 0;
int k = (tight)? digit[idx] : 9;
for (int i = 0; i <= k ; i++)
{
int newTight = (digit[idx] == i)? tight : 0;
ret += digitSum(idx-1, sum+i, newTight, digit);
}
if (!tight)
dp[idx][sum][tight] = ret;
return ret;
}
int rangeDigitSum(int a, int b)
{
memset(dp, -1, sizeof(dp));
vector<int> digitA;
getDigits(a-1, digitA);
long long ans1 = digitSum(digitA.size()-1, 0, 1, digitA);
vector<int> digitB;
getDigits(b, digitB);
long long ans2 = digitSum(digitB.size()-1, 0, 1, digitB);
return (ans2 - ans1);
}
int main()
{
long long a = 123, b = 1024;
cout << "digit sum for given range : "
<< rangeDigitSum(a, b) << endl;
return 0;
}