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 ...
随机推荐
- mysql主从模式部署
1.下载tar.gz格式的安装包 下载地址https://dev.mysql.com/downloads/mysql/ 2.解压 tar -zvxf mysql-5.7.19-linux-glibc2 ...
- Linux实战(13):Centos8 同步时间
前言 以下操作是通过ntpdate命令实现同步 timedatectl set-timezone Asia/Shanghai # 设置时区 rpm -ivh http://mirrors.wlnmp. ...
- 集群实战(2):K8S集群节点退出加入操作
以下报错网上其实也可以找到并解决,但是偏零碎我只是根据自己的在使用中遇到的问题做个汇总. 文章目录 首先删掉节点 node重新加入 参考文档 首先删掉节点 注意:以下操作都是在master下操作. 一 ...
- node.js conditionDebug VScode 配置
launch.json { // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. // 欲了解更多信息,请访问: https://go.microsoft.com/f ...
- java 多线程-4
十四.sleep方法和wait方法的区别 [面试题] 相同点: 一旦执行方法,都可以使得当前线程进入阻塞状态. 不同点: 两个方法的声明位置不同:Thread类声明sleep():Object类中声明 ...
- 线程的阻塞 sleep() wait() yield()
为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了 ...
- MyBatis学习(四)代码生成器MyBatis-Generator
一.简介 前面写过一篇文章介绍了如何使用Mybatis,那么如果我门数据库中有许许多多的表的时候,每张表都手动去写对应的mapper的映射关系,会非常麻烦,那么我们可以使用代码生成器MyBatis-G ...
- Spring学习(七)bean装配详解之 【通过注解装配 Bean】【自动装配的歧义解决】
自动装配 1.歧义性 我们知道用@Autowired可以对bean进行注入(按照type注入),但如果有两个相同类型的bean在IOC容器中注册了,要怎么去区分对哪一个Bean进行注入呢? 如下情况, ...
- jstl中ftm标签用法
<fmt:formatDate value="${dateTime}" pattern="yyyy/MM/dd HH:mm:ss"/>
- Ajax一目了然
1.ajax的概念 局部刷新技术.不是一门新技术,是多种技术的组合.是浏览器端的技术. 2.ajax的作用. 实现在当前结果页面中显示其他请求的响应内容 3.ajax的使用 ajax的基本流程 //创 ...