hdu2089||hdu3555简单数位DP
来源:互联网 发布:sql 约束类型 编辑:程序博客网 时间:2024/05/26 08:43
题意:给一个闭区间[m, n]输出该区间内有多少个数不含62和4.
分析: 由于刚学习数位DP这方面的题,这道题算是 一个入门题了,对这类与数类有关的区间统计问题,在网上看到了好几种方法
1,、可以先预处理,然后再递推得出答案,用F[i, st]表示位数为i状态为st的方案数。
2、可以通过dfs记忆化搜索来做,通过最高位到最低位,枚举第i位可以存在的状态最后再相加就可以了,感觉这种方法容易理解,且不容易写错。
3、对本道题来讲,可以枚举 从0~n不含62和4的数也可以枚举包含62和4的数,前者相对比较简单
#include <stdio.h>#include <string.h>#include <algorithm>#include <iostream>using namespace std;#define ll __int64ll f[25][3];int bit[10];ll dfs(int len, int st, int flag)//st表示前一位是否为6,flag表示前一位是与最高位相同{ if (!len) return 1; if (!flag && f[len][st] != -1) return f[len][st];//如果已经算过了就不需要再算了 int x = flag ? bit[len] : 9; ll ans = 0; for (int i = 0; i <= x; i++) { if ((st && i==2) || i == 4) continue;//如果含62或4剪枝 ans += dfs(len-1, i==6, flag&&i==x); } return flag ? ans : f[len][st] = ans;}ll solve(int x){ int len = 0, tmp = x; while (tmp) { bit[++len] = tmp%10; tmp /= 10; } ll ans = dfs(len, 0, 1); return ans;}int main(){ int n, m; memset(f, -1, sizeof(f)); while (cin >> m >> n) { if (m==0 && n==0) break; cout << (solve(n)-solve(m-1)) << endl; } return 0;}
ll dfs(int pos, int st, int flag)//st = 0表示不含49,st = 1表示前一位含4,st= 2,表示已经含49{<span style="white-space:pre"></span>//flag表示前一位是否与最高位不同 if (pos == 0) return st == 2; if (flag && f[pos][st] != -1) return f[pos][st]; ll ans = 0; for (int i = 0; i <= x; i++) { if (st == 2 || (st==1&&i==9)) ans += dfs(pos-1, 2, flag||i<x); else if (i==4) ans += dfs(pos-1, 1, flag||i<x); else ans += dfs(pos-1, 0, flag||i<x); } if (flag) f[pos][st] = ans; return ans;//返回含49的数的个数}
ll dfs(int len, int st, int flag)//st表示 前一位是否为4,flag表示前一位是否与最高位相同{ if (!len) return 1; if (!flag && f[len][st] != -1) return f[len][st]; int x = flag ? bit[len] : 9; ll ans = 0; for (int i = 0; i <= x; i++) { if (st && i==9) continue; ans += dfs(len-1, i==4, flag&&i==x); } return flag ? ans : f[len][st] = ans;//返回不含49的个数 }
0 0
- hdu2089||hdu3555简单数位DP
- hdu3555,hdu2089 数位dp
- [hdu2089&&hdu3555]数位DP
- hdu2089 & hdu3555 基础数位DP
- 数位DP HDU3555+CF55D+HDU2089
- [基础数位DP] HDU2089 不要62 HDU3555 Bomb
- 数位DP!!!(hdu3555 hdu2089 hdu5898 2016弱校10.5 I)
- HDU2089 不要62(简单的数位DP)
- 【数位DP】 hdu3555 Bomb
- 【hdu3555】【数位DP】Bomb
- 【数位DP】Bomb HDU3555
- hdu3555 Bomb 数位DP
- hdu3555数位dp
- 数位dp hdu3555
- HDU3555:Bomb(数位DP)
- hdu3555 Bomb (数位DP)
- HDU3555 Bomb 数位DP
- hdu3555 数位DP
- Java学习笔记 - JVM加载类纯语言描述
- Unity3d触摸屏手势控制镜头旋转卡位到目标对象
- 使用位逻辑运算来实现位向量
- 寓教于乐 11款最适合教儿童编程的学习工具
- iOS-开发日志-UITextView介绍
- hdu2089||hdu3555简单数位DP
- 1030. 完美数列(25)
- jQuery插件开发全解析
- uva 1108 - Mining Your Own Business(强连通)
- tomcat异常之org.apache.catalina.LifecycleException:
- UDP协议通信简单代码分析
- 准备篇--初接任务
- Setting模块深入分析
- Android Api Demos登顶之路(五十五)Service Messenger Service