HDU 3555 Bomb(1-n含有“49”的数字个数)
2016-08-29 18:08
477 查看
题目链接:
HDU 3555 Bomb
题意:
求1到中含有“49”序列的数字的个数。491,149都是含有“49”序列但是“419”不是的。
数据范围:
分析:
数位dp。差不多也是模版题了。
从高位到低位记录前一位数字,并且记录当前是否已出现“49”序列,最后判断下状态,记忆化搜索。
HDU 3555 Bomb
题意:
求1到中含有“49”序列的数字的个数。491,149都是含有“49”序列但是“419”不是的。
数据范围:
分析:
数位dp。差不多也是模版题了。
从高位到低位记录前一位数字,并且记录当前是否已出现“49”序列,最后判断下状态,记忆化搜索。
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; typedef long long ll; int T; ll n; int digit[20]; ll dp[20][10][2][2]; ll dfs(int pos, int pre, int state, int limit) { if (pos == -1) return state; if (dp[pos][pre][state][limit] != -1) return dp[pos][pre][state][limit]; int last = limit ? digit[pos] : 9; // 是否已达数值上界 ll ret = 0; for (int i = 0; i <= last; ++i) { ret += dfs(pos - 1, i, state || (i == 9 && pre == 4), limit && i == last); } dp[pos][pre][state][limit] = ret; return ret; } ll solve() { int len = 0; memset(dp, -1, sizeof (dp)); memset(digit, 0, sizeof (digit)); while (n) { digit[len++] = n % 10; n /= 10; } return dfs(len - 1, 0, 0, 1); } int main() { scanf("%d", &T); while (T--) { scanf("%lld", &n); printf("%lld\n", solve()); } return 0; }
相关文章推荐
- 【HDU 5366】The mook jong 详解
- 【HDU 2136】Largest prime factor 详细图解
- 【HDU 1568】Fibonacci 数学公式 详解
- HDU 1568
- HDU1290
- TYVJ1193 括号序列解题报告
- TYVJ上一些DP的解题报告
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- HDU 1000
- HDU 1001