萌新刚学数位 dp,求助一个问题
查看原帖
萌新刚学数位 dp,求助一个问题
534296
aCssen楼主2023/7/25 18:13

在本题中,为什么如下写法不正确:

ll dfs(int pos,int cnt,bool st,bool limit){
	if(cnt>3) return 0;
	if(pos>len) return 1;
	if(!limit&&f[pos][cnt]!=-1) return f[pos][cnt];
	int res=limit?a[pos]:9;
	ll ret=0;
	for(int i=0;i<=res;i++){
		if(st&&i==0) ret+=dfs(pos+1,cnt,1,limit&&i==res);
		else ret+=dfs(pos+1,cnt+(i>0),0,limit&&i==res);
	}
	if(!limit&&!st) f[pos][cnt]=ret;
	return ret;
}
ll get(ll x){
	len=0;
	while(x){
		a[++len]=x%10;
		x/=10;
	}
	reverse(a+1,a+len+1);
  	return dfs(1,0,1,1);
}

而以下写法是正确的:

ll dfs(int pos,int cnt,bool st,bool limit){
	if(cnt>3) return 0;
	if(!pos) return 1;
	if(!limit&&f[pos][cnt]!=-1) return f[pos][cnt];
	int res=limit?a[pos]:9;
	ll ret=0;
	for(int i=0;i<=res;i++){
		if(st&&i==0) ret+=dfs(pos-1,cnt,1,limit&&i==res);
		else ret+=dfs(pos-1,cnt+(i>0),0,limit&&i==res);
	}
	if(!limit&&!st) f[pos][cnt]=ret;
	return ret;
}
ll get(ll x){
	len=0;
	while(x){
		a[++len]=x%10;
		x/=10;
	}
	return dfs(len,0,1,1);
}

两种方法都是从高位向低位枚举,理论上讲是等价的,那么为什么写法 1 是错误的而写法 2 是正确的呢?跪求大佬解答

2023/7/25 18:13
加载中...