Bomb [数位DP]
来源:互联网 发布:席德梅尔 知乎 编辑:程序博客网 时间:2024/05/19 22:02
题目与传统数位DP略有不同,是求区间内带有49的数字的个数。
如果是求不带有49的,那会非常简单,如果求带有49的,只需要在每次dfs找到可行情况的时候将后面的结果都加上。
如果上一位是4,且这一位是9,那么根据是否是limit限制,确定之后有的个数加上。 否则直接dfs下一位。
#include <cstdio>#include <cstring>#include <iostream>#include <cmath>using namespace std;typedef long long LL;const int N = 30;LL z[N] = {1};int t;int bit[N];LL dp[N][2], n;LL dfs(int len, bool is4, bool ismax) { if (len == 0) return 0; if (!ismax && dp[len][is4] >= 0) return dp[len][is4]; LL cnt = 0; int mmax = ismax ? bit[len] : 9; for (int i = 0; i <= mmax; i++) { if (is4 && i == 9) { cnt += ismax ? n % z[len-1] + 1 : z[len-1]; } else { cnt += dfs(len - 1, i == 4, ismax && bit[len] == i); } } return ismax ? cnt : dp[len][is4] = cnt;}LL solve(LL n) { int len = 0; while (n) { bit[++len] = n % 10; n /= 10; } bit[len + 1] = 0; return dfs(len, false, true);}int main(){ memset(dp, -1, sizeof(dp)); for (int i = 1; i < N; i++) { z[i] = z[i - 1] * 10; } scanf("%d", &t); while (t--) { scanf("%I64d", &n); printf("%I64d\n", solve(n)); } return 0;}
阅读全文
0 0
- 【数位DP】 hdu3555 Bomb
- 【hdu3555】【数位DP】Bomb
- 【数位DP】Bomb HDU3555
- hdu3555 Bomb 数位DP
- HDU3555:Bomb(数位DP)
- hdu3555 Bomb (数位DP)
- HDU3555 Bomb 数位DP
- Hdu3555 - Bomb - 数位dp
- hdu3555 Bomb 数位dp
- hdu3555 Bomb(数位DP)
- HDU3555 Bomb 数位DP
- Bomb(数位Dp)
- HODJ3555 Bomb【数位dp】
- HDU3555 Bomb 数位DP
- Bomb(数位DP)
- HDU3555 Bomb(数位DP)
- hdu3555 Bomb(数位dp)
- 【数位DP】HDU3555-Bomb
- RxJava Essentials 中文翻译版
- Python基础三
- 14. nohup
- 方法的调用
- link标签中的integrity和crossorigin字段
- Bomb [数位DP]
- 大数据面试算法[牛客笔记]
- 数组的反转
- org.apache.hadoop.io.nativeio.NativeIO$Windows.createFileWithMode0(Ljava/lang/String;JJJI)Ljava/io/F
- JVM系列三:JVM参数设置、分析
- Maximum Subarray
- 从面向过程到面向对象
- 不思念
- 第 0012 题: 敏感词文本文件 filtered_words.txt,里面的内容 和 0011题一样,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成「**是个好