windy数
windy数指的是相邻两位差至少为2的数。问区间[a,b]中有多少个windy数
调了半个多小时,不过调出来之后对数位dp理解大大加深
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> using namespace std; inline int read() { int f=1,x=0; char ch=getchar(); while(ch<'0' || ch>'9') {if(ch=='-') f=-1; ch=getchar();} while(ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } int a,b; int c[15],f[15][10][2];//f数组要开3位(这就是我为什么要调它) int dp(int pos,int num,bool done,bool flag) { if(pos==0) return 1; if(!flag && f[pos][num][done]!=-1) return f[pos][num][done]; int res=0; int r=flag ? c[pos] : 9; for(int i=0;i<=r;i++) { if(abs(i-num)<2 && !done) continue; res+=dp(pos-1,i,done && i==0,flag && i==c[pos]); } f[pos][num][done]=res; return res; } int find(int x) { memset(f,-1,sizeof(f)); int cnt=0; while(x>0) { c[++cnt]=x%10; x/=10; } return dp(cnt,0,1,1)-1; } int main() { a=read(); b=read(); printf("%d\n",find(b)-find(a-1)); return 0; }