数位dp样例没过
查看原帖
数位dp样例没过
658786
STUDENT00楼主2022/11/26 15:59

代码很好理解的:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int l,r,dp[15][15][15][2][2][2];
vector<int> v;
int dfs(int w,int a,int b,bool flag,bool ok,bool c){
	if(w==v.size()) return ok;
	if(dp[w][a][b][flag][ok][c]!=-1) return dp[w][a][b][flag][ok][c];
	int ans=0;
	for(int i=0;i<=(flag?v[w]:9);i++){
		if(i==4||i==8) continue;
		if(c&&!i) ans+=dfs(w+1,i,a,flag&&i==v[w],0,1);
		else ans+=dfs(w+1,i,a,flag&&i==v[w],ok||a==i&&b==i,0);
	}
	return dp[w][a][b][flag][ok][c]=ans;
}
int f(int n){
	memset(dp,-1,sizeof(dp));
	v.clear();
	while(n){
		v.push_back(n%10);
		n/=10;
	}
	reverse(v.begin(),v.end());
	return dfs(0,11,11,1,0,1);
}
signed main(){
	scanf("%lld%lld",&l,&r);
	printf("%lld",f(r)-f(l-1));
	return 0;
}
2022/11/26 15:59
加载中...