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

题意:求区间[a,b]内包含有'49'的数的总个数。

分析:dp[pos][0]表示到第pos位没有包含49,后面1~pos-1位任意填时的总个数,dp[pos][1]表示到第pos位时前一位刚好是'4',后面任意填时的总个数,dp[pos][2]表示已经包含49后面任意填的总个数。。。

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 10007
#define inf 0x3f3f3f3f
#define N 100010
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
LL dp[][];
int dig[];
LL dfs(int pos,int pre,bool flag,bool limit)
{
if(pos==)return flag;
if(!limit&&flag&&~dp[pos][])return dp[pos][];
if(!limit&&!flag&&pre==&&~dp[pos][])return dp[pos][];
if(!limit&&!flag&&pre!=&&~dp[pos][])return dp[pos][];
int len=limit?dig[pos]:;
LL ans=;
for(int i=;i<=len;i++)
{
if(pre==&&i==)ans+=dfs(pos-,i,flag||,limit&&i==len);
else ans+=dfs(pos-,i,flag||,limit&&i==len);
}
if(!limit)//分情况记录状态
{
if(flag)dp[pos][]=ans;
else if(pre==)dp[pos][]=ans;
else dp[pos][]=ans;
}
return ans;
}
LL solve(LL x)
{
int len=;
while(x)
{
dig[++len]=x%;
x/=;
}
LL ans=dfs(len,,,);
return ans;
}
int main()
{
LL n,T;
scanf("%I64d",&T);
while(T--)
{
scanf("%I64d",&n);
memset(dp,-,sizeof(dp));
printf("%I64d\n",solve(n));
}
}

hdu3555(数位dp)的更多相关文章

  1. hdu3555 数位dp

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  2. hdu3555数位dp基础

    /* dp[i][0|1|2]:没有49的个数|最高位是9,没有49的个数|有49的个数 dp[i][0]=10*dp[i-1][0]-dp[i-1][1] dp[i][1]=dp[i-1][0] d ...

  3. hdu3555(数位DP dfs/递推)

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submi ...

  4. 数位dp浅谈(hdu3555)

    数位dp简介: 数位dp常用于求区间内某些特殊(常关于数字各个数位上的值)数字(比如要求数字含62,49): 常用解法: 数位dp常用记忆化搜索或递推来实现: 由于记忆化搜索比较好写再加上博主比较蒟, ...

  5. hdu3555 Bomb (记忆化搜索 数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. hdu---(3555)Bomb(数位dp(入门))

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submi ...

  7. hdu3555 Bomb 数位DP入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...

  8. 【Hdu3555】 Bomb(数位DP)

    Description 题意就是找0到N有多少个数中含有49. \(1\leq N \leq2^{63}-1\) Solution 数位DP,与hdu3652类似 \(F[i][state]\)表示位 ...

  9. 【hdu3555】Bomb 数位dp

    题目描述 求 1~N 内包含数位串 “49” 的数的个数. 输入 The first line of input consists of an integer T (1 <= T <= 1 ...

  10. [Hdu3555] Bomb(数位DP)

    Description 题意就是找0到N有多少个数中含有49. \(1\leq N \leq2^{63}-1\) Solution 数位DP,与hdu3652类似 \(F[i][state]\)表示位 ...

随机推荐

  1. 基于visual Studio2013解决面试题之0506取和为m的可能组合

     题目

  2. 基于visual Studio2013解决C语言竞赛题之1078打印日历

        题目 解决代码及点评 /************************************************************************/ /* ...

  3. UVA11552------FEWEST FLOPS------区间型的DP

    题目地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. 国际化之ResourceBundle

    软件在开发时要能使它同时应对世界不同地区和国家的使用,针对不同地区和国家的访问,提供相应的,符合使用者阅读习惯的操作环境,这就必须要有国际化的概念,国际化又称为“i18n”:international ...

  5. mysql基础:列类型--整型

    mysql列类型--字符串  http://blog.csdn.net/jk110333/article/details/9342301 mysql列类型--时间和日期    http://blog. ...

  6. No matching code signing identity found

    真机调试过程中弹出这个问题,网上找到的解决的方法,记录一下. .... 弄完这些步骤之后,上面多出一个 IOS disturbution.所以出现这个问题的解决办法应该是设置的证书没有刷新到本地所致.

  7. Swift - 项目部署配置(支持的系统,设备和状态条样式等)

    点击项目,在General选项卡中的“Deployment Info”栏目中可以进行一些项目的配置 Deployment Target:支持的iOS SDK的最低版本 Device:所支持的设备(iP ...

  8. 在StatusBar中显示当前时间

    在StatusBar中显示当前时间,如下: 1.在String Table中插入一项 (注意:状态栏将根据字符串的长度来确定相应窗格的缺省宽度,所以指定为00:00:00就为时间的显示预留了空间)   ...

  9. ExtJs4 笔记(7) Ext.tip.ToolTip 提示

    本篇介绍提示控件,ExtJs支持两种方式定义提示,可以支持普通html元素和一般的ExtJs UI控件. 一.基本提示 Ext.tip.ToolTip 1.最简单的提示 下面通过代码定义一个最简单的提 ...

  10. Dom4j和Xpath(转)

    1.DOM4J简介 DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和JAXP. DOM4J使 ...