求助
  • 板块灌水区
  • 楼主Jerry_heng
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/13 19:19
  • 上次更新2023/11/2 14:05:37
查看原帖
求助
763878
Jerry_heng楼主2023/10/13 19:19

P4124 数位DP打挂了

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[21],l,r,dp[21][11][11][2][2][2];
int dfs(int pos,int pre1,int pre2,bool x,bool fr,bool _4,bool _8){
	if(_4&&_8)return 0;
	if(pos==0)return x;
	if(!fr&&dp[pos][pre1][pre2][x][_4][_8]!=-1)return dp[pos][pre1][pre2][x][_4][_8];
	int res=0,limit=fr?a[pos]:9;
	for(int i=0;i<=limit;i++)
		res+=dfs(pos-1,pre2,i,x||(pre2==i&&pre1==pre2),fr&&(i==limit),_4||(i==4),_8||(i==8));
	if(!fr)dp[pos][pre1][pre2][x][_4][_8]=res;
	return res;
}
int solve(int x){
	int cnt=0;
	while(x){
		a[++cnt]=x%10;
		x/=10;
	}
	if(cnt<11)return 0;
	int res=0;
	for(int i=1;i<=a[cnt];i++)
		res+=(cnt-1,0,i,0,i==a[cnt],i==4,i==8);
	return res;
}
signed main(){
	memset(dp,-1,sizeof dp);
	cin>>l>>r;
	cout<<solve(r)-solve(l-1);
	return 0;
}
2023/10/13 19:19
加载中...