救救萌新,修改了下状态方程就过不了了/(ㄒoㄒ)/~~
查看原帖
救救萌新,修改了下状态方程就过不了了/(ㄒoㄒ)/~~
263480
ACM_001楼主2020/7/22 09:33
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
ll dp[12][11][11][11][2][2][2][2];
int m[12];
ll dfs(int p, int a, int b, int d, int c, int _4, int _8, int _3) {
	/*  
		p:当前处理第p位数
		a:当前第p位数的值
		b:当前第p+1位数的值
		d:当前第p+2位数的值
		c:之前是否已经保证x<n
		_4:是否出现过4
		_8:是否出现过8
		_3:是否出现过连续三位数
	*/
	if (_4 && _8)	
		return 0;
	if (p <= 1)		
		return _3;//
	if (dp[p][a][b][d][c][_4][_8][_3] != -1)
		return dp[p][a][b][d][c][_4][_8][_3];

	int up = !c ? m[p] : 9;
	ll ans = 0;
	for (int i = 0; i <= up; i++) {
		ans += dfs(p - 1, i, a, b, c || (i < up), _4 || i == 4, _8 || i == 8, _3 || (i == a && a == b));
	}
	dp[p][a][b][d][c][_4][_8][_3] = ans;
	return ans;
}



ll solve(ll n) {
	if (n < 1e10) 
		return 0;
	int len;
	memset(dp, -1, sizeof(dp));
	for (len = 0; n; n /= 10) {
		m[++len] = n % 10;
	}
	ll ans = 0;
	for (int i = 1; i <= m[len]; i++) {
		//当前处理第11位,
		//第11位值为i,
		//第11+1位值为-1,
		//第11+2位值为-1,
		//当前位是否受上界约束,
		//是否出现4,
		//是否出现8,
		//是否有连续3个相同数
		ans += dfs(11, i, -1, -1, i < m[len], i == 4, i == 8, 0);
	}
	return ans;
}
 
int main() {
	ll l, r;
	cin >> l >> r;
	//l = 12121284000, r = 12121285550;
	cout << solve(r) - solve(l - 1) << endl;
	return 0;
}

一晚上也没看出来哪错了QAQ

2020/7/22 09:33
加载中...