题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555

Bomb

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 18739    Accepted Submission(s): 6929

Problem Description
The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence includes the sub-sequence "49", the power of the blast would
add one point.
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?
 
Input
The first line of input consists of an integer T (1 <= T <= 10000), indicating the number of test cases. For each test case, there will be an integer N (1 <= N <= 2^63-1) as the description.

The input terminates by end of file marker.

 
Output
For each test case, output an integer indicating the final points of the power.
 
Sample Input
3
1
50
500
 
Sample Output
0
1
15

Hint

From 1 to 500, the numbers that include the sub-sequence "49" are "49","149","249","349","449","490","491","492","493","494","495","496","497","498","499",
so the answer is 15.

题解:

数位DP通用:dp[pos][sta1][sta2][……]

表示:当前位为pos,之前的状态为sta1*sta2*……stan。n为限制条件的个数。

回到此题,限制条件有两个: 1.上一位是否为4; 2.之前是否已经出现49。

类似题目:http://blog.csdn.net/dolfamingo/article/details/72848001

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+;
const int maxn = +; LL n;
LL a[maxn], dp[maxn][]; LL dfs(int pos, int status, bool lim)
{
if(!pos) return status==;
if(!lim && dp[pos][status]!=-) return dp[pos][status]; LL ret = ;
int m = lim?a[pos]:;
for(int i = ; i<=m; i++)
{
int tmp_status;
if(status== || status== && i==)
tmp_status = ;
else if(i==)
tmp_status = ;
else
tmp_status = ; ret += dfs(pos-, tmp_status, lim&&(i==m));
} if(!lim) dp[pos][status] = ret;
return ret;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
int p = ;
while(n)
{
a[++p] = n%;
n /= ;
}
memset(dp,-, sizeof(dp));
LL ans = dfs(p, , );
printf("%lld\n",ans);
}
}

最新文章

  1. Multiload-ng
  2. mui框架使用的过程中遇到的几个问题
  3. JSON解析实例——使用Json-lib
  4. 东大oj-1511: Caoshen like math
  5. joomla allvideo 去掉embed share
  6. DWZ框架学习
  7. 暑假集训(4)第四弹 -----排列,计数(hdu1465)
  8. bzoj 1242: Zju1015 Fishing Net 弦图判定
  9. IE6 BUG margin 两倍
  10. SlimFTPd, LFTP和FileZilla Client/Server
  11. Semantic UI中的验证控件的事件的使用
  12. 关于oracle数据库(3)
  13. iOS数据本地化
  14. ConcurrentHashMap、CopyOnWriteArrayList、LinkedHashMap
  15. java实现字符串数字部分自增
  16. ubuntu中环境变量文件/etc/profile、.profile、.bashrc、/etc/bash.bashrc之间的区别和联系
  17. Archlinux/Manjaro使用笔记-使用makepkg安装软件 报错:未找到strip分割所需的二进制文件 的解决方法
  18. idea tomcat上传图片,无法显示的问题解决
  19. Hibernate之关联关系映射(一对多和多对一映射,多对多映射)
  20. LOIC

热门文章

  1. SPFA的两个(卡时)优化
  2. 【Tomcat】linux下实时查看tomcat运行日志
  3. NOJ 1111 保险箱的密码 【大红】 [区间dp]
  4. gulp 环境搭建
  5. Codeforces 665D Simple Subset【构造】
  6. T1229 数字游戏 codevs
  7. File类 递归 获取目录下所有文件文件夹
  8. javafx中多场景的切换
  9. Redhat7/centOs7 安装配置python3.6.5
  10. Android菜单menu控件大全