BZOJ1026 [SCOI2009] windy数
2016-07-12 10:39
274 查看
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数
还算是一道标准的数位dp,不过使用递归完成数位dp的注意了,因为在同为零的情况下,数字零会有首位与非首位的区别,为了这个wa点本弱debug了一个多小时。
还有就是本弱犯的第二个错误,把首位的零直接当作-2处理,其实倒没啥,问题在于,dp[len][-2]是什么鬼东西嘛....
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数
还算是一道标准的数位dp,不过使用递归完成数位dp的注意了,因为在同为零的情况下,数字零会有首位与非首位的区别,为了这个wa点本弱debug了一个多小时。
还有就是本弱犯的第二个错误,把首位的零直接当作-2处理,其实倒没啥,问题在于,dp[len][-2]是什么鬼东西嘛....
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<iostream> using namespace std; typedef long long ll; ll num[100]; ll dp[100][10][10]; int lenx; ll dfs(int len,ll digit,ll flag,bool first) { if(!len) return 1; if(!flag&&dp[len][first][digit]!=-1) return dp[len][first][digit]; ll maxn=flag?num[len]:9; ll ans=0; for(int i=0;i<=maxn;i++) { if(i==0&&first) ans+=dfs(len-1,0,flag&&i==maxn,1); else if(first) ans+=dfs(len-1,i,flag&&i==maxn,0); else if(abs(i-digit)>=2) { ans+=dfs(len-1,i,flag&&i==maxn,0); } } if(!flag) dp[len][first][digit]=ans; return ans; } ll calc(ll x) { lenx=0; while(x) { num[++lenx]=x%10; x/=10; } return dfs(lenx,0,1,1); } int main() { int m,n; memset(dp,-1,sizeof(dp)); scanf("%lld %lld",&n,&m); //for(int i=0;i<20;i++) //printf("%lld %lld\n",calc(m),calc(n-1)); //printf("%lld %lld\n",calc(m),calc(n-1)); printf("%lld\n",calc(m)-calc(n-1)); return 0; }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- LFC1.0.0 版本发布
- ACM程序设计大赛题目分类
- 2015年acm国内排名
- Android dpi,dip,dp的概念以及屏幕适配
- 计算字符串最后一个单词长度
- Android px、dp、sp之间相互转换
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- 矩阵的乘法操作
- android中像素单位dp、px、pt、sp的比较