数位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了.今 ...
随机推荐
- node.js在windows下的学习笔记(3)---npm
1.什么是npm npm是Node.js的包管理器,它允许开发人员在Node.js的应用程序中创建,共享,重用模块.之前我们通过node的官网的安装程序安装了Node.js,那么npm就已经装好了的. ...
- gdb调试程序
一.准备好内容vim test3.c 输入如下即可 #include <stdio.h> int func(int n) { int sum=0,i; f ...
- ZBLibrary不能运行的解决方法
ADT运行 右键ZBLibrary Demo > Run as > Android Application 可能出现部分错误,解决方案如下: 右键Project(这里为ZBLibrar ...
- 练习题之ThreadLocal
public class ThreadLocalMain { private static ThreadLocal<Integer> value = new ThreadLocal< ...
- sbit命令行中运行scala脚本
一般sbit编译器采成了scala运行工具.启动sbit命令行,输入console,命令行自动切换到scala编辑器面. scala>:paste 然后手动将XXX.scala中的代码拷贝到界面 ...
- html 微信开发——微信授权
微信JS-SDK说明文档 链接地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html 微信web开发:http: ...
- 重温css系列01
2016-01-07——解决背景层透明度的问题 需要ie9+ 问题:如果我对div设置opacity: 0.8;这个透明属性后 希望内容不发生改变怎么弄? A:做两层,或者rgba 解决后的效果图: ...
- 使用Azure Redis Cache
通过上一篇博客<Redis Cache 简介>我们已经简单了解了Azure Redis Cache,这里就不过多赘述了. 1.创建Redis Cache 创建Redis Cache之前,我 ...
- MediaPlayer SeekTo 不准确的解决方案
接上篇文章,最近做视频背景的游戏. 需要使用安卓的meidaplayer来播放视频,并跳转. 跳转时发现,有些视频可以跳到位置上,有些不行. GG了好久,可以使用FFMPEG这个工具重新转一次.并加上 ...
- C#中 字符串的处理
3.字符串 1).字符串的不可变性 当你给一个字符串重新赋值之后,老值并没有销毁,而是重新开辟一块空间存储新值. 当程序结束后,GC扫描整个内存,如果发现有的空间没有被指向,则立即把它销毁. 2).我 ...