hdu 2089 不要62(数位dp)
2014-11-01 17:20
344 查看
f[i, j] 以j开始的位数为i的满足要求的数字数目
Count(x) 计算[0, x) 中满足要求的个数
最终答案 Count(m+1) - Count(n)
Count(x) 计算[0, x) 中满足要求的个数
最终答案 Count(m+1) - Count(n)
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <vector> #include <queue> #include <stack> #include <cassert> #include <algorithm> #include <cmath> #include <set> #include <list> #include <map> #include <limits> using namespace std; #define MIN(a, b) ((a) < (b) ? (a) : (b)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i)) #define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i)) #define REPOK(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i)) #define MAXN 1000000 /***************BEGINHERE*****************/ int f[15][10], a[15]; int n, m; int Count(int x) { int tmp = x, cnt = 0; if (!x) return 0; // 得到各个数位 从cnt-1至0是从高到低 while (tmp) { a[cnt++] = tmp%10; tmp /= 10; } int ret = 0; a[cnt] = -1; for (int k=cnt-1;k>=0;--k) { for (int i=a[k]-1;i>=0;--i) { if (a[k+1]==6&&i==2) continue; ret += f[k+1][i]; } if (a[k+1]==6&&a[k]==2) break; if (a[k] == 4) break; } //cout << ret << endl; return ret; } int main() { freopen("input.in", "r", stdin); REP(i, 0, 9) f[0][i] = 0; f[0][0] = 1; REP(k, 1, 7) REP(i, 0, 9) { f[k][i] = 0; REP(j, 0, 9) { if (i == 4) continue; if (i == 6 && j == 2) continue; f[k][i] = f[k][i] + f[k-1][j]; } } while(scanf("%d%d",&n,&m) && (n|m)) { cout << Count(m+1) - Count(n) << endl; } return 0; }
相关文章推荐
- HDU 2089 不要62 还是基础数位dp
- hdu 2089(不要62)数位DP
- HDU-2089 不要62 数位DP 模板题
- HDU - 2089 不要62 (暴力或数位DP)
- hdu 2089 不要62--数位dp入门
- hdu 2089 不要62 数位DP
- HDU 2089:不要62(数位DP)
- HDU 2089 不要62(数位dp)
- HDU 2089 不要62(数位DP)
- [HDU 2089]不要62[数位DP]
- hdu 2089 不要62(数位dp)
- hdu 2089 不要62 hdu 3555 Bomb (数位DP)
- HDU 2089 不要62 数位dp入门
- hdu 2089 不要62--数位dp入门
- HDU 2089 不要62(数位DP)
- hdu 2089 不要62(数位DP)
- hdu 2089 不要62 --- 数位dp
- HDU 2089——不要62(数位DP)
- hdu 2089 不要62 数位dp
- HDU 2089 不要62(数位DP入门)