测试点#6,#12,#13,#21,#22,#25RE了.
我的代码:
#include<bits/stdc++.h>
using namespace std;
long long f[23][10][11][2];
long long dfs(vector<int>& number, int pos, int pre, int ppre, bool huiwen, bool limit){
if(pos == -1)
return huiwen;
if(limit == false && f[pos][pre][ppre][huiwen] != -1)
return f[pos][pre][ppre][huiwen];
long long res = 0;
int end = limit == true ? number[pos] : 9;
for(int i = 0; i <= end; i ++)
res += dfs(number, pos - 1, i, pre, huiwen | (i == ppre) | (i == pre), limit & (i == end));
if(limit == false)
f[pos][pre][ppre][huiwen] = res;
return res;
}
long long slove(long long n){
vector<int> number;
number.clear();
while(n > 0){
number.push_back(n % 10);
n /= 10;
}
long long res = 0;
int t = number.size();
for(int i = 1; i <= t - 2; i ++)
for(int j = 1; j <= 9; j ++)
res += dfs(number, i - 1, j, 10, 0, 0);
for(int i = 1; i <= number[t - 1]; i ++)
res += dfs(number, t - 2, i, 10, 0, (i == number[number.size() - 1]));
return res;
}
int main(){
memset(f, -1, sizeof(f));
long long l, r;
cin >> l >> r;
cout << r - l + 1 - slove(r) + slove(l - 1) << endl;
return 0;
}