Time Limits: 1000 ms Memory Limits: 65536 KB
Description
windy定义了一种windy数。
不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。
windy想知道,在A和B之间,包括A和B,总共有多少个windy数?
两个整数,A B。
Output
一个整数,表示A~B中有多少个windy数。
Sample Output
Data Constraint
Hint
100%的数据,满足 1 <= A <= B <= 2000000000 。
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include<bits/stdc++.h> using namespace std; int num[11],dp[11][11]; inline int read() { char ch=getchar();int num=0; while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9'){ num=num*10+ch-'0';ch=getchar();} return num; } inline int Abs(int x) { return x>0?x:-x; } inline int dfs(int len,int las,bool top,bool zero) { if(len==0)return 1; if(!top&&!zero&&dp[len][las]!=-1) return dp[len][las]; int cnt=0,maxx=(top?num[len]:9); for(int i=0;i<=maxx;i++){ if(Abs(i-las)<2)continue; int p=i;if(zero&&i==0)p=-555; cnt+=dfs(len-1,p,top&&(i==maxx),(p==-555)); } if(!zero&&!top) dp[len][las]=cnt; return cnt; } inline int work(int x) { int tot=0; while(x){ num[++tot]=x%10; x/=10; } memset(dp,-1,sizeof(dp)); return dfs(tot,-555,true,true); } int main() { int x=read(); int y=read(); printf("%d",work(y)-work(x-1)); return 0; }
|
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 暗影小站! 注: 本博客暂不开设评论区,请使用邮件119548583@qq.com联系