旁听途说这个名字很久了,了解了一下。

改题目的意思是给你若干区间,让你找寻区间内不含62或4的数。

首先暴力必然T。。。那么实际上就是说,想办法做一种预处理,在每次输入的时候取值运算就可以了。

既然是DP先说一下dp[ i ][ j ]:

表示有 i 位并且最高为是 j 的数包含多少符合条件的数。

(读者仔细思考一下为什么这样设定,为什么这样子可以得到答案,实际dp训练的就是这个)

然后接下来最重要的就是DP转移方程了,首先对于i等于1的情况来说直接赋值就好了。

如果 i 不等于1,则传递关系如下:

dp[ i ][ j ]=  if ( j == 4 ) dp[ i ][ j ]=0

     else if ( j != 6) dp[ i ][ j ]=Σdp[ i -1][ k ] (k=0,1,2,3,4,5,6,7,8,9)

     else if ( j == 6) dp[ i ][ j ]=Σdp[ i -1][ k ] (k=0,1,3,4,5,6,7,8,9)

通俗的言语表达就是,如果最高为j,j又是4,那直接gg,等于0,其余如果j不是6,那么递归的时候无需考虑右边一位是不是2,直接全加,

最后如果j是6,那么右一位除了是2的情况全加,这就是递归方程了。

在如上计算之后,我们可以通过对dp数组中不同的值的拼凑来得到0到某个数的区间内有多少个符合条件的数。

然后知道形如  [0, i )这样的区间内的个数,如果给定任意区间 [a , b],则可以拆分成两个区间相间即[0 , b) - [0 , a)

那么怎么拼凑呢?

比如345这个数,假设a1是最高位3,a2是4,a3是5,

那么我们就取最高位为0,1,2的所有数和,加上最高位为3,次高位为0,1,2,3(4不能选,虽然比5小,但是有4了)的所有之和,再加上。。。类比下去。

代码如下:

#include<iostream>
using namespace std;
#define ll long long
ll dp[][]; void cal_dp()
{
dp[][]=;
for (int i=;i<;i++)
{
for (int j=;j<;j++)
{
if (j==) dp[i][j]=;
else if (j==)
{
for (int k=;k<;k++)
dp[i][j]+=dp[i-][k];
dp[i][j]-=dp[i-][];
}
else
{
for (int k=;k<;k++)
dp[i][j]+=dp[i-][k];
}
}
}
} int a[];
ll solve(int n)
{
a[]=;
while (n)
{
a[++a[]]=n%;
n/=;
}
a[a[]+]=;
ll ans=;
for (int i=a[];i>=;i--)
{
for (int j=;j<a[i];j++)
if (j!= && !(a[i+]== && j==))
ans+=dp[i][j];
if (a[i]==) break;
if (a[i+]== && a[i]==) break;
}
return ans;
} int main()
{
int n,m;
cal_dp();
while (scanf("%d %d",&n,&m)== && (n||m))
{
ll k1=solve(m+);
ll k2=solve(n);
printf("%I64d\n",k1-k2);
}
return ;
}

hdu2089数位DP的更多相关文章

  1. hdu2089 数位dp

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. hdu2089(数位DP 递推形式)

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  3. HDU2089 不要62[数位DP]

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  4. 数位dp入门 hdu2089 不要62

    数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...

  5. [您有新的未分配科技点]数位dp:从懵X到板子(例题:HDU2089 不要62)

    数位dp主要用来处理一系列需要数数的问题,一般套路为“求[l,r]区间内满足要求的数/数位的个数” 要求五花八门……比如“不出现某个数字序列”,“某种数的出现次数”等等…… 面对这种数数题,暴力的想法 ...

  6. hdu2089:不要62(基础数位dp)

    题意:规定一个合法的号码不能含有4或者是连续的62 给定区间[n,m] 问此区间内合法的号码的个数 分析:数位dp dp[i][j]代表 最高位为 j 的 i 位数有多少个合法的 然后按题目规则进行转 ...

  7. 【数位DP】【HDU2089】不要62

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  8. hdu2089(数位dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间[a,b]内不含有62或4的数的个数. 分析:数位dp,dp[pos][0]表示到第 ...

  9. hdu2089 不要62 我的第一个数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位DP的入门题,我是根据kuangbin的博客写出来的 思路: dp[i][0],表示长度为i ...

随机推荐

  1. ubuntu Linux下chromium无法使用flash解决方法

    Chromium作为谷歌的开源浏览器将不再支持Netscape浏览器插件API,Adobe公司的Flash将无法正常工作了.然而用户可以使用Pepper Flash Player,这是谷歌浏览器上一款 ...

  2. django 之模板层

    1. 模板语法之变量 格式:{{ 变量名 }} 句点符,深度查询(可以点到方法,不要加括号,只能是无参的方法) 代码 视图函数: from django.shortcuts import render ...

  3. UCML 原生Android中嵌入Cordova Webview

    Android实现在当前进程打开网页可以将Cordova中的WebView嵌入Android项目中,实现简单,不需要自己实现,所以掌握如何嵌入WebView对项目快速开发很有帮助 官方也有这方面的教程 ...

  4. thymeleaf数组下标

    <tr th:if="${exercisers != null}"th:each="exerciser:${exercisers}"> <td ...

  5. 01java基础笔记

    计算机组成:运算器,控制器,存储器,输入输出设备(外部设备I/O设备) 机器语言:机器语言,汇编语言,高级语言 人机交互:命令行方式,图形化界面交互方式 JAVA语言平台分为:J2SE,J2ME,J2 ...

  6. JavaBean详解

    JavaBean详解 我们对JavaBean的理解可以从java和bean两个方面来理解,对于Java我们都很清楚,而bean在计算机中的含义为可重用组件.(ps:对Spring中的bean是不是有了 ...

  7. 前端学习笔记——HTML

    1.前端的三把利器 HTML:我们把它比喻成赤裸的一个人 CSS:华丽的衣服 JS/JavaScript:赋予这个人的行为,也就是动起来 2.什么是HTML? HTML 是用来描述网页的一种语言.ht ...

  8. PHP 原生上传图片

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> < ...

  9. python#父与子编程之旅-11嵌套与可变循环

    for multiplier in range(5,8): for i in range(2,11): print(i,"x",multiplier,"=",i ...

  10. CF1220F

    CF1220F 把整棵树分成1的左边和1的右边两部分 最优情况两边子树深度的差一定可以是一 如果还可以是2,也可以通过把多的那一边的点往另一边移使他变成1 如果往一个端点加点,一定不会使这一边变优,也 ...