例题:不要62

同步数位DP

需要统计区间[l,r]的满足题意的数的个数,这往往可以转换成求[0,r]-[0,l)

基本思想与方法

有了上述性质,我们就可以从高到低枚举第一次<n对应位是哪一位。

这样之前的位确定了,之后的位就不受n的限制即从00...0~99...9,可以先预处理,然后这时就可以直接统计答案。

预处理F数组。

F[i,st] 代表 位数为i(可能允许前导0。如00058也是个5位数),状态为st的方案数。这里st根据题目需要确定。

如i=4,f[i,st]也就是0000~9999的符合条件的数的个数(十进制)

决策第i位是多少(such as 0~9)

F[i,st] = F[i,st] + f[i–1,st']

st'为相对应的状态

参照刚刚所说的基本思路。预处理f数组,然后统计[0,m] - [0,n).

f[i,j]代表开头是j的i位数中不含"62"或"4"的数有几个。

如f[2,6]包含60,61,63,65,66,67,68,69

for(i=;i<=;i++)//因为数据为1000000,所以预处理7位
for(j=;j<=;j++)//第i位
for(k=;k<=;k++)//第i-1位
if(j!=&&!(j==&&k==))f[i][j]+=f[i-][k];

接下来,怎么算出0-n和0-m区间的答案数呢?

用一个通用函数(Cal):

如456=f[3][0]+f[3][1]+f[3][2]+f[3][3]+f[3][4](为什么不枚举到5呢?因为再下一位枚举了)

+f[2][0]+f[2][1]+f[2][2]+f[2][3]+f[2][4](就是这一位)

+f[1][0]+f[1][1]+f[1][2]+f[1][3]+f[1][4]+f[1][5]+f[1][6].

#include<cstdio>//最右边是第一位
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
int f[][];
int Cal(int k)//求1~k中有多少符合的数.
{
int len,digit[],i,j,ans=;
memset(digit,,sizeof(digit)),len=;//digit[i]为当前的某个数从右到左第i个位置的数是多少.
while(k>){digit[++len]=k%;k/=;}
for(i=len;i>=;i--)
{
for(j=;j<=digit[i]-;j++)//每一位只能到k的下一位,所以计算的数实际只能到k-1.所以Cal()中传数要加1.
{
if(j!=&&!(j==&&digit[i+]==))ans+=f[i][j];
}
if(digit[i]==||(digit[i]==&&digit[i+]==))break; //如果这一位本来就没法,则后面的情况报废
}
return ans;
}
int main()
{
int n,m,i,j,k;
memset(f,,sizeof(f));//f[i][j]为以j开始的且不含"62"和"4"位数为i的个数.
f[][]=;
for(i=;i<=;i++)
{
for(j=;j<=;j++)//第i位
{
for(k=;k<=;k++)//第i-1位
{
if(j!=&&!(j==&&k==))f[i][j]+=f[i-][k];
}
}
}
while()
{
scanf("%d %d",&n,&m);
if(n==&&m==)break;
printf("%d\n",Cal(m+)-Cal(n));//因为当前的Cal(k)是计算出从1到k-1的符合条件的数的个数,所以要计算n~m的个数要用Cal(m+1)-Cal(n).
}
return ;
}

C++ hdu 例题:不要62 题解的更多相关文章

  1. Hdu 2089 不要62 (数位dp入门题目)

    题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...

  2. 数位dp整理 && 例题HDU - 2089 不要62 && 例题 HDU - 3555 Bomb

    数位dp: 数位dp是一种计数用的dp,一般就是要统计一个区间[li,ri]内满足一些条件数的个数.所谓数位dp,字面意思就是在数位上进行dp.数位的含义:一个数有个位.十位.百位.千位......数 ...

  3. 题解——HDU 2089 不要62(数位DP)

    最近在学数位DP 应该是入门题吧 设\( dp[i][0/1] \)表示到第\( i \)位时,前一位是否是6的满足条件的数的个数 然后就是套路 注意\( limit \)的限制条件以及转移时候信息的 ...

  4. HDU 2089 不要62 (数位DP)题解

    思路: 详解 数位DP入门题dp[pos][sta],pos代表当前位数是第几位,sta代表当前状态,因为题目中只要不出现64,所以当前状态只分为两种:前一位是6或不是. #include<io ...

  5. HDU 2089 - 不要62 - [数位DP][入门题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  6. HDU 2089 不要62:数位dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 问你在区间[n,m]中,有多少个数字不含"4"且不含"62 ...

  7. Codeforces Beta Round #62 题解【ABCD】

    Codeforces Beta Round #62 A Irrational problem 题意 f(x) = x mod p1 mod p2 mod p3 mod p4 问你[a,b]中有多少个数 ...

  8. HDU 2089 不要62(数位dp入门)

    题意:统计区间 [a,b] 中不含 4 和 62 的数字有多少个. 题解:这是数位DP的入门题了,首先要理解数DP的原理,DP[i][j]:代表第i位的第j值,举个栗子:如4715   数位数是从右向 ...

  9. hdu 2089 不要62(初学数位DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给定 m,.n; 求车牌号 m~n之间 有多少数字 不含 4或62     ,8652是可以的 . ...

随机推荐

  1. TCP网络通讯如何解决分包粘包问题(有模拟代码)

    TCP作为常用的网络传输协议,数据流解析是网络应用开发人员永远绕不开的一个问题. TCP数据传输是以无边界的数据流传输形式,所谓无边界是指数据发送端发送的字节数,在数据接收端接受时并不一定等于发送的字 ...

  2. java_Mac安装多个JDK版本并设置环境变量

    JDK6.JDK7.JDK8三个版本的汇总地址:https://pan.baidu.com/s/1pKSYv8Z 安装 JDK6安装 JDK6下载地址 见网盘 安装完毕后确认版本 JavaForOSX ...

  3. StaticResource和DynamicResource

    Resource 资源(Resource)是保存在可执行文件中的一种不可执行数据,用来保存一些可以被重复利用的样式,对象定义以及一些传统的资源如二进制数据,图片等等我们可以在任何元素上定义资源 Sta ...

  4. XF Grid使用-两行两列-跟WPF不同

    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...

  5. sql server 定时备份数据库

    CREATE PROCEDURE [dbo].[SP_DBBackup_EveryNight_Local] @cycle INT, ---保存周期 @IsLocal INT, ---是否为本地 0表示 ...

  6. C++和QML混合的QT程序调试方法

    以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...

  7. SQL Server 事务复制分发到订阅同步慢

    原文:SQL Server 事务复制分发到订阅同步慢 最近发现有一个发布经常出现问题,每几天就出错不同步,提示要求初始化.重新调整同步后,复制还是很慢!每天白天未分发的命令就达五六百万条!要解决慢的问 ...

  8. NET C#创建WINDOWS系统用户

    原文:NET C#创建WINDOWS系统用户   /前提是当前用户有相应的权限 /WinNT用户管理 using System; using System.DirectoryServices;  na ...

  9. BackgroundWorker 简单使用教程 多个线程的创建

    原文:BackgroundWorker 简单使用教程 多个线程的创建 BackgroundWorker是一个非常不错的线程控件,能避免界面假死,让线程操作你想要做的事,它学习起来很简单,但是能实现很强 ...

  10. WebApi实现验证授权Token,WebApi生成文档等 - CSDN博客

    原文:WebApi实现验证授权Token,WebApi生成文档等 - CSDN博客 using System; using System.Linq; using System.Web; using S ...