数位dp入门 hdu2089 不要62
题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以。。貌似可以,但是直接TLE了2333).其实是数位DP的入门题;
- 初探数位DP:写的很详细(看完就不必看我的代码了..)
- f[i,j]:位置长度为i以j开头的符合条件的数的个数;(一般的dp式子中,第二个参数依题意);这就直接可以推出f[i,j] = f[i,j] + f[i-1,k] ( j != 6 || k != 2)
- 开始打表打出所有的f[i][k];之后就sum(a)计算小于a的符合要求的数的个数(相当于树状数组);里面从高位起,看小于a的情况数(只看高位),这就导致了当高位不符合
- **范围计数详见sum();
#include<bits/stdc++.h>
using namespace std;
int f[][];
void init()
{
f[][] = ;
for(int i = ;i <= ;i++){
for(int j = ;j <= ;j++)
for(int k = ;k <= ;k++)
if(j != && (j != || k != ))
f[i][j] = f[i][j] + f[i-][k];
}
}
int sum(int a)
{
int digit[]={},len = ;
while(a){
digit[++len] = a % ;
a /=;
}
int ans = ,i,j;
for(i = len;i > ;i--){ //哪一位小于n;
for(j = ;j < digit[i];j++)//当j = 0时,代表了所有位数比n少的情况,即049,009均包括了,所以在后面出现的数其实是最高位和n相同的数;
if(j != && (j != || digit[i+] != ))
ans += f[i][j];
if(j == || (j == && digit[i+] == ))
break;
}
return ans;
}
int main()
{
init();
int a,b;
while(scanf("%d%d",&a,&b) == && a + b){
printf("%d\n",sum(b+) - sum(a));
}
}
用递归写起来更清爽,递归版本:
#include<bits/stdc++.h>
using namespace std;
int dp[][];
int bit[];
int dfs(int pos,int d,int on = )
{
if(pos == ) return ;
int ans = dp[pos][d];
if(!on && dp[pos][d] != -) return ans;
ans = ;
int e = (on? bit[pos]:);
for(int i = ;i <= e; i++)
if(i != && (d != || i != ))
ans += dfs(pos - ,i,i == e && on);
if(!on) dp[pos][d] = ans;
return ans;
}
int cal(int a)
{
int tot = ;
while(a){
bit[++tot] = a%;
a /= ;
}
return dfs(tot,);
}
int main()
{
memset(dp,-,sizeof(dp));
int n,m;
while(scanf("%d%d",&n,&m) == && n + m){
//cout<<cal(m)<<" "<<cal(n - 1)<<" ";
printf("%d\n",cal(m) - cal(n - ));
}
}
数位dp入门 hdu2089 不要62的更多相关文章
- 【数位dp】hdu2089 不要62
http://www.cnblogs.com/xiaohongmao/p/3473599.html #include<cstdio> using namespace std; int n, ...
- HDU 2089 不要62【数位DP入门题】
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- xbz分组题B 吉利数字 数位dp入门
B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...
- hdu3555 Bomb 数位DP入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...
- 数位DP入门题——[hdu2089]不要62
数位DP是我的噩梦. 现在初三了,却没AC过数位DP的题目. 感觉数位DP都是毒瘤-- 题目 hdu不用登录也可以进去,所以就不把题目copy到这里来了. 题目大意 求区间[n,m][n,m][n,m ...
- HDU 2089 不要62(数位dp入门)
题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 题解:这是数位DP的入门题了,首先要理解数DP的原理,DP[i][j]:代表第i位的第j值,举个栗子:如4715 数位数是从右向 ...
- HDU 2089 - 不要62 - [数位DP][入门题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- HDU-2089不要62-暴力或数位DP入门
不要62 题意:给定区间,求在这个区间中有多少个数字,不包含4且不包含62: 这道题作为数位DP的入门题: 暴力也是可以过 #include<cstdio> #include <io ...
- Hdu 2089 不要62 (数位dp入门题目)
题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...
随机推荐
- 学习笔记:暴力破解WIFI小软件
小弟 自己的学习笔记,做练习的 ,缺陷还很多,做到无法解决速度问题就不想做下去了,如果要看的话 主要是思路问题,获取句柄,控制句柄而已,代码比较简单.大神勿喷啊 破解DEMO源码:http://dow ...
- 关机相关(shutdown,reboot)
慣用的關機指令: shutdown 由於Linux的關機是那麼重要的工作,因此除了你是在主機前面以tty7圖形介面來登入系統時, 不論用什麼身份都能夠關機之外,若你是使用遠端管理工具(如透過piett ...
- 进程控制之waitid函数
Single UNIX Specification的XSI扩展包括了另一个取进程终止状态的函数--waitid,此函数类似于waitpid,但提供了更多的灵活性. #include <sys/w ...
- 理解OAuth 2.0--转
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...
- web.xml配置文件 taglib
web.xml的内容如下: <?xml version="1.0" encoding="UTF-8"?><web-app version= ...
- iOS之在内存中绘图
与直接在UIView控件上绘图不同,在内存中绘图时,需要开发者自己准备绘图环境,Quartz 2D提供了一个非常便捷的函数:UIGraphicsBeginImageContext(CGSize siz ...
- Mac上安装boost开放环境
方法一: 去Macports官网的下载页面(https://distfiles.macports.org/MacPorts/)下载对用Mac系统的pkg文件,下载完成之后,双击,一路[下一步],到安装 ...
- DELETE---删除记录
DELETE FROM table_name [WHERE conditions]; 例: DELETE FROM userinfo WHERE name='zhangsan'; 说明 1.不添加条件 ...
- SharePoint 文档库实现文件夹拖放到文档库
打开文档库-> 选择文件夹-> 在Ribbon中选择“库(list)”-> 在右边可以看到打开方式-> 选择用资源管理器打开-> 在新打开的资源管理器中可能实现对文夹的拖 ...
- 20151212Jquery 工具函数代码备份
$(function () { /*var str=' jquery '; alert(str); alert($.trim(str));*/ /*var arr=['张三','李四','王五','麻 ...