DFS 模板
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int dp[N][N];
int a[N],len;
int n,m;
//pos 代表当前位置 limit是当前位置是否有这个枚举范围限制
int dfs(int pos,int pre,int limit){
if(!pos)return 1;
if(!limit&&~dp[pos][pre])return dp[pos][pre];
int res = 0,up = limit?a[pos]:9;
for(int i=0;i<=up;i++){
if(i==4||(i==2&&pre==6))continue;
res += dfs(pos-1,i,limit&&i==up);
}
return limit?res:dp[pos][pre] = res;
}
int cal(int x){
memset(dp,-1,sizeof dp);
len = 0;
while(x)a[++len] = x%10,x/=10;
return dfs(len,0,1);
}
int main()
{
while(cin>>n>>m,n){
cout<<cal(m)-cal(n-1)<<'\n';
}
}
带前导0
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int dp[N][N];
int a[N],len;
int dfs(int pos,int pre,int lead,int limit){
if(!pos)return 1;
if(!lead&&!limit&&~dp[pos][pre])return dp[pos][pre];
int res = 0,up = limit?a[pos]:9;
for(int i=0;i<=up;i++){
if(abs(i-pre)<2)continue;
if(lead&&!i)res+=dfs(pos-1,-2,lead&&!i,limit&&i==up);
else res+=dfs(pos-1,i,lead&&!i,limit&&i==up);
}
return lead?res:(limit?res:dp[pos][pre] = res);
}
int cal(int x){
memset(dp,-1,sizeof dp);
len = 0;
while(x)a[++len] = x%10,x/=10;
return dfs(len,-2,1,1);
}
int n,m;
int main()
{
cin>>n>>m;
cout<<cal(m)-cal(n-1)<<'\n';
}
数字游戏
![](https://img-blog.csdnimg.cn/direct/d75a29724ee14ee0ab07e3f4513fc044.png)
#include<iostream>
#include<cstring>
using namespace std;
const int N = 305;
int dp[N][N];
int a[N];
int dfs(int len,int last,int limit){
if(!len)return 1;
if(!limit&&~dp[len][last])return dp[len][last];
int up = limit?a[len]:9;
int res = 0;
for(int i=0;i<=up;++i){
if(i<last)continue;
res += dfs(len-1,i,limit&&i==up);
}
return limit?res:dp[len][last] = res;
}
int cal(int x){
memset(dp,-1,sizeof dp);
int len = 0;
while(x){
a[++len] = x%10;
x/=10;
}
return dfs(len,0,1);
}
int main()
{
int l,r;
while(cin>>l>>r){
cout<<cal(r)-cal(l-1)<<"\n";
}
}
Windy 数
![](https://img-blog.csdnimg.cn/direct/3ef38f07242a4ef6a968e6b0a10ab1df.png)
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int dp[N][N];
int a[N];
int dfs(int len,int last,int limit,int lead){
if(!len)return 1;
if(!limit&&!limit&&~dp[len][last])return dp[len][last];
int res = 0;
int up = limit?a[len]:9;
for(int i=0;i<=up;++i){
if(abs(i-last)<2)continue;
if(!i&&lead)res+=dfs(len-1,-2,limit&&i==up,lead&&!i);
else res+=dfs(len-1,i,limit&&i==up,lead&&!i);
}
return limit?res:(lead?res:dp[len][last]=res);
}
int cal(int x){
memset(dp,-1,sizeof dp);
int len = 0;
while(x)a[++len] = x%10,x/=10;
return dfs(len,-2,1,1);
}
int main()
{
int l,r;
cin>>l>>r;
cout<<cal(r)-cal(l-1)<<"\n";
}
数字游戏II
![](https://img-blog.csdnimg.cn/direct/6a235d7ba0de49259de77ca305eccef6.png)
#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int dp[N][1000];
int a[N];
int c;
int dfs(int len,int s,int limit){
if(!len)return s%c==0;
if(!limit&&~dp[len][s])return dp[len][s];
int res = 0;
int up = limit?a[len]:9;
for(int i=0;i<=up;++i){
res+=dfs(len-1,s+i,limit&&i==up);
}
return limit?res:dp[len][s] = res;
}
int cal(int x){
memset(dp,-1,sizeof dp);
int len = 0;
while(x)a[++len] = x%10,x/=10;
return dfs(len,0,1);
}
int main()
{
int l,r;
while(cin>>l>>r>>c)cout<<cal(r)-cal(l-1)<<"\n";
}
不要62
![](https://img-blog.csdnimg.cn/direct/e5699e8c3494431b8848322f1d48336d.png)
#include<iostream>
#include<cstring>
using namespace std;
const int N = 35;
int dp[N][N];
int a[N];
int dfs(int len,int last,int limit){
if(!len)return 1;
if(!limit&&~dp[len][last])return dp[len][last];
int up = limit?a[len]:9;
int res = 0;
for(int i=0;i<=up;++i){
if(i==4)continue;
if(last==6&&i==2)continue;
res+=dfs(len-1,i,limit&&i==up);
}
return limit?res:dp[len][last] = res;
}
int cal(int x){
memset(dp,-1,sizeof dp);
int len = 0;
while(x){
a[++len] = x%10;
x/=10;
}
return dfs(len,0,1);
}
int main()
{
int l,r;
while(cin>>l>>r,l){
cout<<cal(r)-cal(l-1)<<"\n";
}
}