链接:https://www.luogu.org/problemnew/show/P2657
题目描述
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
输入输出格式
输入格式:
包含两个整数,A B。
输出格式:
一个整数
输入输出样例
说明
100%的数据,满足 1 <= A <= B <= 2000000000 。
题解:数位dp, 注意前面全是0的情况
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; int dp[20][10][2][2], digit[20], len; int dfs(int dep, int t, int f, int al){ if(!dep)return 1; if(dp[dep][t][f][al])return dp[dep][t][f][al]; int i = f ? digit[dep] : 9; int tmp = 0; for(; i >= 0; i--){ if(abs(t - i) >= 2 || al) tmp += dfs(dep-1, i, f&&(i == digit[dep]), al&&(i==0)); } return dp[dep][t][f][al] = tmp; } int query(int a){ len = 0; memset(dp, 0, sizeof(dp)); while(a){ digit[++len] = a%10; a /= 10; } // if(len == 1)digit[++len] = 100; int ans = dfs(len, 0, 1, 1); //printf("%d ",ans); return ans; } int main(){ int A, B, cnt ; scanf("%d%d", &A, &B); printf("%d ", query(B) - query(A-1)); }