メモ化する。
memo[桁数][4の数][7の数][まだ一致しているか]
const int L = 11;
lli memo[L][L][L][2];
string s;
lli rec(int len, int _4, int _7, bool small)
{
if (len == s.size()) return abs(_4 - _7);
if (memo[len][_4][_7][small] != -1) return memo[len][_4][_7][small];
lli sum = 0;
int begin, end;
if (small) {
begin = 0, end = 9;
} else {
begin = 0, end = s[len] - '0';
}
for (int i = begin; i <= end; ++i) {
sum += rec(len + 1, _4 + (i == 4), _7 + (i == 7), small || i < s[len] - '0');
}
return memo[len][_4][_7][small] = sum;
}
class SumOfLuckiness {
public:
long long theSum(int A, int B)
{
char buff[L];
fill(&memo[0][0][0][0], &memo[L - 1][L - 1][L - 1][2], -1);
sprintf(buff, "%d", A - 1);
s = string(buff);
lli a = rec(0, 0, 0, false);
fill(&memo[0][0][0][0], &memo[L - 1][L - 1][L - 1][2], -1);
sprintf(buff, "%d", B);
s = string(buff);
lli b = rec(0, 0, 0, false);
return b - a;
}
};
0 件のコメント :
コメントを投稿