RE求助
查看原帖
RE求助
490378
_lyx1311_楼主2021/4/20 20:34

测试点#6,#12,#13,#21,#22,#25RE\mathbb{RE}了.

我的代码:

#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; 
}

2021/4/20 20:34
加载中...