hdu 3555(数位dp)
来源:互联网 发布:ip怎么看域名 编辑:程序博客网 时间:2024/04/28 18:44
题意:给一个最大2^64的数字,问从1到这个数字共有多少个数字中含有‘49’,输出个数。
题解:数位dp基础题,dp数组第一维还是pos,第二维判断前一位是否是4,第三维是是否出现了49,从而使枚举的数字唯一。
#include <stdio.h>#include <string.h>const int N = 30;__int64 f[N][2][2];int num[N];__int64 dp(int pos, bool is4, bool flag, bool limit, bool ok) {if (pos == -1 && ok)return 1;else if (pos == -1)return 0;if (!limit && f[pos][is4][ok] != -1)return f[pos][is4][ok];int end = limit ? num[pos] : 9;__int64 ans = 0;for (int i = 0; i <= end; i++) {if (i == 0 && flag)ans += dp(pos - 1, 0, 1, limit && i == end, ok);else if (i == 9 && is4)ans += dp(pos - 1, 0, 0, limit && i == end, 1);else if (i == 4)ans += dp(pos - 1, 1, 0, limit && i == end, ok);elseans += dp(pos - 1, 0, 0, limit && i == end, ok);}if (!limit)f[pos][is4][ok] = ans;return ans;}__int64 solve(__int64 n) {int pos = 0;while (n) {num[pos++] = n % 10;n /= 10;}return dp(pos - 1, 0, 1, 1, 0);}int main() {int t;__int64 n;scanf("%d", &t);while (t--) {memset(f, -1, sizeof(f));scanf("%I64d", &n);printf("%I64d\n", solve(n));}return 0;}
0 0
- hdu 3555 数位dp
- hdu 3555 数位dp
- HDU 3555 数位DP
- HDU 3555 \数位DP
- hdu 3555 数位DP
- HDU 3555 数位DP
- hdu 3555 数位DP
- hdu 3555 数位dp
- 数位DP HDU-3555
- HDU 3555 数位DP
- hdu 3555(数位dp)
- hdu 3555(数位dp)
- hdu 3555(数位dp)
- HDU 3555 数位DP
- hdu 3555【数位DP】
- hdu 3555(数位dp)
- HDU 3555 数位DP
- hdu 3555 数位dp
- java泛型受限
- (转)运维经验分享:Hadoop管理员的十个最佳实践
- redis PHP非常有用的文章
- SQL添加数据
- JBPM表结构
- hdu 3555(数位dp)
- 招聘后台MVC优化与微信端优化重构
- 【Note】动态规划初步1-Ch9-《算法竞赛入门经典2nd》
- uboot之start.S源码分析
- webkit扩展DOM事件
- 用emacs 建立开发环境,安装ecb和cedet的全过程
- listview加载性能优化ViewHolder
- Python的ODBC接口 ceODBC 2.0.1 发布
- uboot之smdk2410.h源码