1026: [SCOI2009]windy数(数位dp)
2018-01-12 20:14
351 查看
1026: [SCOI2009]windy数
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 9016 Solved: 4085
[Submit][Status][Discuss]
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,
在A和B之间,包括A和B,总共有多少个windy数?
Input
包含两个整数,A B。
Output
一个整数
Sample Input
【输入样例一】1 10
【输入样例二】
25 50
Sample Output
【输出样例一】9
【输出样例二】
20
HINT
【数据规模和约定】
100%的数据,满足 1 <= A <= B <= 2000000000 。
分析
数位dp,注意特判第一位,注意只有在没有限制和第一位存在这两个条件同时满足时,使用数位dp。
code
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> using namespace std; int a[100],p; int dp[100][10]; // 当前第i位,上一位是j int dfs(int pos,int pre,bool fir,bool limit) { if (pos==0) return 1; if (!limit && fir && dp[pos][pre]!=-1) return dp[pos][pre]; int u = limit ? a[pos] : 9; int cnt = 0; for (int i=0; i<=u; ++i) { if (fir && (fir && abs(pre-i) < 2)) continue; cnt += dfs(pos-1,i,(fir||(!fir&&i!=0)),limit&&i==a[pos]); } if (!limit && fir) dp[pos][pre] = cnt; return cnt; } int Calc(int x) { if (x==0) return 1; if (x==1) return 2; memset(dp,-1,sizeof(dp)); p = 0; while (x) { a[++p] = x % 10;x /= 10; } return dfs(p,-1,false,true); } int main () { int L,R; while (cin >> L >> R) cout << Calc(R) - Calc(L-1) << "\n"; return 0; }
相关文章推荐
- 【bzoj1026】【SCOI2009】【windy数】【数位dp】
- BZOJ_1026_[SCOI2009]_windy数_(数位dp)
- bzoj1026 [SCOI2009]windy数(数位dp)
- bzoj1026 [SCOI2009]windy数 数位DP
- BZOJ 1026 [SCOI2009]windy数【数位DP】
- 【bzoj1026】[SCOI2009]windy数 数位DP
- [BZOJ1026][SCOI2009]windy数(数位dp)
- BZOJ 1026 [SCOI2009]windy数 数位DP?
- bzoj1026: [SCOI2009]windy数(数位dp)
- 【BZOJ1026】【SCOI2009】windy数(数位dp)
- bzoj1026: [SCOI2009]windy数 数位dp
- [数位dp] bzoj1026: [SCOI2009]windy数
- BZOJ1026 [SCOI2009]windy数(数位dp)
- BZOJ 1026 [SCOI2009]windy数 数位dp
- bzoj 1026 [SCOI2009]windy数 数位dp
- 数位dp BZOJ 1026: [SCOI2009]windy数
- BZOJ.1026.[SCOI2009]windy数(数位DP)
- BZOJ1026: [SCOI2009]windy数(数位dp)
- bzoj 1026: [SCOI2009]windy数 (数位dp)
- [BZOJ1026]SCOI2009 windy数|数位DP