bzoj 1026: [SCOI2009]windy数(数位dp)
2017-06-30 14:13
399 查看
1026: [SCOI2009]windy数
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7688 Solved: 3470
[Submit][Status][Discuss]
Description
windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?Input
包含两个整数,A B。Output
一个整数Sample Input
1 1025 50
Sample Output
920
比较水的数位dp
dp[i][x]表示在第i+1位为x的情况下有多少个windy数
注意前导0,如果遍历到当前第i位但前面全是0,那么第i位的取值就没有限制!
#include<stdio.h> #include<string.h> #include<stdlib.h> int bit[15], dp[15][15]; int Sech(int len, int pos, int flag, int q0) { int i, ans, u; if(len==0) return 1; if(flag==0 && dp[len][pos]!=-1) return dp[len][pos]; ans = 0; if(flag==1) u = bit[len]; else u = 9; for(i=0;i<=u;i++) { if(pos==-1 || abs(i-pos)>=2) { if(q0==1 && i==0) ans += Sech(len-1, -1, flag && i==u, q0 && i==0); else ans += Sech(len-1, i, flag && i==u, q0 && i==0); } } if(flag==0 && q0==0) dp[len][pos] = ans; return ans; } int Jud(int x) { int len; len = 0; while(x) { bit[++len] = x%10; x /= 10; } return Sech(len, -1, 1, 1); } int main(void) { int n, m; memset(dp, -1, sizeof(dp)); while(scanf("%d%d", &n, &m)!=EOF) printf("%d\n", Jud(m)-Jud(n-1)); 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】
- bzoj 1026 [SCOI2009]windy数 数位dp
- [bzoj1026][SCOI2009]windy数_数位dp
- 【数位DP】bzoj1026: [SCOI2009]windy数
- 【BZOJ】1026: [SCOI2009]windy数(数位dp)
- bzoj 1026: [SCOI2009]windy数 (数位dp)
- 【bzoj 1026】[SCOI2009]windy数(数位dp)
- BZOJ1026(SCOI2009)[windy数]--数位DP
- BZOJ1026: [SCOI2009]windy数[数位DP]
- 【BZOJ 1026】【SCOI2009】[数位dp]windy数
- 【bzoj1026】【SCOI2009】【windy数】【数位dp】
- BZOJ_1026_[SCOI2009]windy数_数位DP
- BZOJ 1026 [SCOI2009]windy数 - 数位DP