hdu2089数位DP
旁听途说这个名字很久了,了解了一下。
改题目的意思是给你若干区间,让你找寻区间内不含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的更多相关文章
- hdu2089 数位dp
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu2089(数位DP 递推形式)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU2089 不要62[数位DP]
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 数位dp入门 hdu2089 不要62
数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...
- [您有新的未分配科技点]数位dp:从懵X到板子(例题:HDU2089 不要62)
数位dp主要用来处理一系列需要数数的问题,一般套路为“求[l,r]区间内满足要求的数/数位的个数” 要求五花八门……比如“不出现某个数字序列”,“某种数的出现次数”等等…… 面对这种数数题,暴力的想法 ...
- hdu2089:不要62(基础数位dp)
题意:规定一个合法的号码不能含有4或者是连续的62 给定区间[n,m] 问此区间内合法的号码的个数 分析:数位dp dp[i][j]代表 最高位为 j 的 i 位数有多少个合法的 然后按题目规则进行转 ...
- 【数位DP】【HDU2089】不要62
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu2089(数位dp)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间[a,b]内不含有62或4的数的个数. 分析:数位dp,dp[pos][0]表示到第 ...
- hdu2089 不要62 我的第一个数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位DP的入门题,我是根据kuangbin的博客写出来的 思路: dp[i][0],表示长度为i ...
随机推荐
- mysql数据库优化学习
目的避免出现页面访问错误慢查询造成页面无法加载阻塞造成数据无法提交优化从sql及索引,数据库结构,系统配置,硬件 日志慢查询日志: show variables like 'slow_query_ ...
- LOJ 2720 「NOI2018」你的名字——后缀自动机
题目:https://loj.ac/problem/2720 自己总是分不清 “SAM上一个点的 len[ ] ” 和 “一个串的前缀在 SAM 上匹配的 len ”. 于是原本想的 68 分做法是, ...
- ip协议,IP,子网掩码,ping命令是什么
ip协议: 定网络地址的协议叫ip协议,它定义的地址称之为ip地址,广泛采用的v4版本即ipv4,它规定网络地址由32位2进制表示 IP地址:是给每个连接在Internet上的主机分配的一个32bit ...
- 十二、SpringBoot 优雅的集成Spring Security
前言 至于什么是Spring security ,主要两个作用,用户认证和授权.即我们常说的,用户只有登录了才能进行其他操作,没有登录的话就重定向到登录界面.有的用户有权限执行某一操作,而有的用户不能 ...
- IOS 随笔记录
一.IOS 关闭键盘: 1.让所有控件的键盘隐藏 // 这个方法可以让整个view取消第一响应者,从而让所有控件的键盘隐藏 [self.view endEditing:YES]; 2.让某个textF ...
- JS实现的ajax
function createXMLHttpRequest() { try { return new XMLHttpRequest(); } catch (e) { try { return new ...
- Java学习之Static
Static(静态)是一种修饰符,用于修饰成员(成员变量.成员函数) 1.静态方法只能访问静态成员. 2.静态随着类的加载而加载 通过代码分析: class PersonDemo { public s ...
- find php.ini 和 php的执行目录 bin目录
有的时候一台新服务器,有些软件的目录和文件的位置我们不知道在哪里,我们可以用find来寻找 找php.ini find / -name php.ini 找php的执行目录 find / -name p ...
- Perceptron Algorithm 感知器算法及其实现
Rosenblatt于1958年发布的感知器算法,算是机器学习鼻祖级别的算法.其算法着眼于最简单的情况,即使用单个神经元.单层网络进行监督学习(目标结果已知),并且输入数据线性可分.我们可以用该算法来 ...
- vue入门例子
vue入门例子 1.声明示渲染 {{message}} 2.绑定事件 v-bind 3.控制切换一个程序是否显示 v-if 4.渲染循环 ...