在本题中,为什么如下写法不正确:
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 是正确的呢?跪求大佬解答