hdu3555 Bomb (数位dp入门题)
Bomb
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)
Total Submission(s): 19698 Accepted Submission(s): 7311
Problem Description
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?
Input
The input terminates by end of file marker.
Output
Sample Input
1
50
500
Sample Output
1
15
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.
代码(dfs解法):
#include<iostream>
#include<cstring>
#define LL long long
using namespace std; LL bit[25], dp[25][2]; LL dfs(int pos, int is4, int lim)//pos当前位, is4上一位是否为4, lim上一位是否取到最大值
{
if(pos<0) return 1;
if(!lim && dp[pos][is4]!=-1) return dp[pos][is4];
int las=lim?bit[pos]:9;//若上以一位没有取最大值位则可以0~9循环
LL res=0;
for(int i=0; i<=las; ++i)
if(!(is4 && i==9))//搜索不含49的,结果取反
res+=dfs(pos-1, i==4, lim&&i==las);
if(!lim) dp[pos][is4]=res;
return res;
} int main()
{
int T;
memset(dp, -1, sizeof(dp));
cin>>T;
while(T--)
{
LL n;
cin>>n;
LL len=0, m=n;
while(n)
{
bit[len++]=n%10;
n/=10;
}
LL ans=m-dfs(len-1, 0, 1)+1;//结果取反, 且搜索过程中会包含0, 故+1
cout<<ans<<endl;
}
return 0;
}
代码(传统dp):
#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
using namespace std; LL num[25], dp[25][3]; int main()
{
int T;
memset(dp, 0, sizeof(dp));
dp[0][0]=1;
for(int i=1; i<21; ++i)
{
dp[i][0]=dp[i-1][0]*10-dp[i-1][1];//dp[i][0]表示i位数不包含49且最高位不是9的数目
dp[i][1]=dp[i-1][0];//dp[i][1]表示i位数不包含49且最高位是9的数目
dp[i][2]=dp[i-1][2]*10+dp[i-1][1];//dp[i][2]表示i位数包含49的数目
}
cin>>T;
while(T--)
{
LL n;
cin>>n;
int len=0;
memset(num, 0, sizeof(num));
while(n)
{
num[++len]=n%10;
n/=10;
}
int las=0;
bool flag=false;
LL ans=0;
for(int i=len; i>=1; --i)
{
ans+=(dp[i-1][2]*num[i]);//若n=789, 则i=3时此处计算700以内的结果
if(flag) ans+=dp[i-1][0]*num[i];//若之前已包含49
if(!flag && num[i]>4) ans+=dp[i-1][1];//若之前未包含49
if(las==4 && num[i]==9) flag=true;
las=num[i];
}
if(flag) ans++;
cout<<ans<<endl;
}
return 0;
}
hdu3555 Bomb (数位dp入门题)的更多相关文章
- hdu3555 Bomb 数位DP入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...
- HDU3555 Bomb 数位DP第一题
The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the ti ...
- hdu3555 Bomb(数位dp)
题目传送门 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total ...
- HDU 2089 不要62【数位DP入门题】
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu---(3555)Bomb(数位dp(入门))
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submi ...
- HDU3555 Bomb —— 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU 2089 - 不要62 - [数位DP][入门题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- HDU 3555 Bomb 数位DP 入门
给出n,问所有[0,n]区间内的数中,不含有49的数的个数 数位dp,记忆化搜索 dfs(int pos,bool pre,bool flag,bool e) pos:当前要枚举的位置 pre:当前要 ...
- 数位DP入门题——[hdu2089]不要62
数位DP是我的噩梦. 现在初三了,却没AC过数位DP的题目. 感觉数位DP都是毒瘤-- 题目 hdu不用登录也可以进去,所以就不把题目copy到这里来了. 题目大意 求区间[n,m][n,m][n,m ...
随机推荐
- js动画之轮播图
一. 使用Css3动画实现 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- Volatile禁止指令重排序(三)
Volatile禁止指令重排 计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种: 源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系 ...
- JSTL1.1函数标签库(functions)
JSTL1.1函数标签库(functions) 在jstl中的fn标签也是我们在网页设计中经常要用到的很关键的标签,在使用的时候要先加上头 <%@ taglib uri="http:/ ...
- MySQL中concat()、concat_ws()、group_concat()函数的使用技巧与心得总结
Author:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,原创文章, B站技术分享 B站视频 : Bilibili.c ...
- Centos-修改密码-passwd
passwd 更新用户验证令牌,root用户可以修改任意用户密码,但普通用户只能修改自己的密码 相关参数 -l 禁止用户使用密码验证登录,但可以使用ssh-key登录 -u 启动用户密码验证登录 ...
- 依赖注入在 dotnet core 中实现与使用:4. 集成 Autofac
本示例使用 .net core 5 rc-1 实现. 1. 添加 Nuget 包引用 使用 Autofac 当然要添加 Autofac 的 Nuget 包,主要涉及到两个: Autofac.Exten ...
- Book of Shaders 01 - 关于函数造型能力的理解
0x00 从函数出发 Shader 中的很多效果都是由函数计算得出的,如何更好地理解二者的关系呢.不妨先看看函数是什么?函数的定义可以简单地描述为:给定一个集合 A,对于其中的元素施加法则 f,则可以 ...
- Linux设置主机名称与host映射
uname -n :查看host对应的域名 2.在 /etc/hostname 删除原来的重新配置需要的域名 3.在 /etc/hosts 中添加域名和映射ip 4.重启系统 5.其他主机 ...
- Java知识系统回顾整理01基础06数组06二维数组
一.一维数组和二维数组 这是一个一维数组, 里面的每一个元素,都是一个基本类型int int a[] =new int[]{1,2,3,4,5}; 这是一个二维数组,里面的每一个元素,都是一个一维数组 ...
- C++ 双冒号开头的语法是什么
z转载:https://blog.csdn.net/LHHopencv/article/details/78353380 命名空间限定.std::string 表示std命名空间下的 string类. ...