"一千个人的代码中有一千个数位DP"
能过样例,但只能过样例
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int len = 20;
int dp[len][len], b[len],x,y;
int dfs(int pos, int state, bool is_max,bool zero){
if(!pos) return 1;
if(!is_max && ~dp[pos][state]) return dp[pos][state];
// printf("Now it turns to bit %d,with the last number %d",pos,state);
// if(is_max) puts("(max)");
// else puts("");
int end = is_max ? b[pos]:9;
int ans = 0;
for(int i=0; i<=end; i++){
if(zero||abs(i-state)>=2) {
ans+=dfs(pos-1, i, is_max&&i==end,zero&&(!i));
}
// printf("bit %d,numder %d!wendy number succeeded\n",pos,i);
}
if(!is_max) dp[pos][state] = ans;
return ans;
}
int solve(int a){
int cnt=0;
memset(dp,-1,sizeof dp);
memset(b,0,sizeof b);
// cout<<a;
while(a){
b[++cnt]=a%10;
a/=10;
}
// printf("'s len is %d\n",cnt);
return dfs(cnt,2233456,1,1);
}
signed main(){
dp[1][1]=1;
cin>>x>>y;
cout<<solve(y)-solve(x-1);
return 0;
}
悬关,求条