动态规划:数位DP
数位dp一般应用于:
求出在给定区间[A,B]内,符合条件P(i)的数i的个数
条件P(i)一般与数的大小无关,而与 数的组成 有关
例题是一道BZOJ1833,让求出区间所有整数每个数字出现的次数
递推出f[i][j][k]表示长度为i开头j的所有数字中k的个数
这个东西让我想起了大模拟,高精度
#include<cstdio>
using namespace std;
//a,b 10^12
long long a,b;
long long t[];
struct Data{long long a[];}f[][];
Data operator +(Data a,Data b)
{
Data t;
for(int k=;k<=;k++)
t.a[k]=a.a[k]+b.a[k];
return t;
}
inline long long read()
{
long long x=,f=;char ch=getchar();
while(ch<''||ch>'') {if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<='') {x=x*+ch-'';ch=getchar();}
return x*f;
}
Data cal(long long x)
{
Data ans;for(int i=;i<=;i++) ans.a[i]=;
if(x==)
{
ans.a[]=;
return ans;
}
int len=;
while(t[len]>x) len--;
for(int i=;i<len;i++)
for(int j=;j<=;j++)
ans=ans+f[i][j];
ans.a[]++;
int cur=x/t[len];
for(int i=;i<cur;i++) ans=ans+f[len][i];
x%=t[len];
ans.a[cur]+=x+;
for(int i=len-;i;i--)
{
cur=x/t[i];
for(int j=;j<cur;j++)
ans=ans+f[i][j];
x%=t[i];
ans.a[cur]+=x+;
}
return ans;
}
int main()
{
t[]=;
for(int i=;i<=;i++) t[i]=t[i-]*;
for(int i=;i<=;i++) f[][i].a[i]=;
//初始化
//递推出f[i][j][k]表示长度为i开头j的所有数字中k的个数
for(int i=;i<=;i++) //数字长度
for(int x=;x<=;x++)
for(int y=;y<=;y++)
{
f[i][y]=f[i][y]+f[i-][x];
f[i][y].a[y]+=t[i-];
}
a=read();b=read();
Data t1=cal(b),t2=cal(a-);
for(int i=;i<=;i++)
{
printf("%lld",t1.a[i]-t2.a[i]);
if(i!=) printf(" ");
}
return ;
}
cal函数就是计算从0到当前数中每一个数字出现的次数,对a和b分别求然后作差就好了
挺恶心的一种dp
动态规划:数位DP的更多相关文章
- 动态规划——数位dp
通过先前在<动态规划——背包问题>中关于动态规划的初探,我们其实可以看到,动态规划其实不是像凸包.扩展欧几里得等是具体的算法,而是一种在解决问题中决策的思想.在不同的题目中,我们都需要根据 ...
- 模板 - 动态规划 - 数位dp
#include<bits/stdc++.h> using namespace std; #define ll long long ]; ll dp[][/*可能需要的状态2*/];//不 ...
- 动态规划-数位dp
大佬讲的清楚 [https://blog.csdn.net/wust_zzwh/article/details/52100392] 例子 不要62或4 l到r有多少个数不含62或者4 代码 #incl ...
- 有关动态规划(主要是数位DP)的一点讨论
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法.20世纪50年代初美国数学家在研究多阶段决策过程的优化问题时, ...
- 动态规划晋级——HDU 3555 Bomb【数位DP详解】
转载请注明出处:http://blog.csdn.net/a1dark 分析:初学数位DP完全搞不懂.很多时候都是自己花大量时间去找规律.记得上次网络赛有道数位DP.硬是找规律给A了.那时候完全不知数 ...
- 动态规划专题(三)——数位DP
前言 数位\(DP\) 真的是最恶心的\(DP\). 简介 看到那种给你两个数,让你求这两个数之间符合条件的数的个数,且这两个数非常大,这样的题目一般就是 数位\(DP\) 题. 数位\(DP\)一般 ...
- 「动态规划」-数位dp专题
数位dp,今天学长讲的稍玄学,课下花了一会时间仔细看了一下,发现板子是挺好理解的,就在这里写一些: 数位dp主要就是搞一些在区间中,区间内的数满足题目中的条件的数的个数的一类题,题目一般都好理解,这时 ...
- P4317 花神的数论题 动态规划?数位DP
思路:数位$DP$ 提交:5次(其实之前A过,但是调了调当初的程序.本次是2次AC的) 题解: 我们分别求出$sum(x)=i$,对于一个$i$,有几个$x$,然后我们就可以快速幂解决. 至于求个数用 ...
- 数位dp/记忆化搜索
一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an ...
随机推荐
- C++11中initializer lists的使用
Before C++11,there was no easy way to do things like initialize a std::vector or std::map(or a custo ...
- 3 python3 编码解码问题 upd接受数据
1.python3下的中文乱码:send_data.encode("utf-8") from socket import * udp_socket = socket(AF_INET ...
- Java面试题集合
1.Java的HashMap是如何工作的? HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值. HashMap 基于 hashing 原理,我们通过 put ()和 g ...
- nginx location优先级
目录 1. 配置语法 2. 配置实例 3. 总结: 网上查了下location的优先级规则,但是很多资料都说的模棱两可,自己动手实地配置了下,下面总结如下. 1. 配置语法 1> 精确匹配 lo ...
- ubuntu自带的ibus输入法问题解决方法
ubuntu自带的ibus有点问题,输入字的时候不知道是个什么模式. 在网上搜到一个解决方法. 终端下执行: ibus-daemon -drx 然后切换到拼音输入法,就正常了. 写下作为记录.
- 用gradle编译任意结构的Android项目
## 需求 * 继续用`Eclipse`项目的结构,但是使用`gradle`编译,或者说任意的项目结构进行编译. ## 解决方案 1. Android studio的项目结构 1. Android S ...
- Page Object 设计模式介绍
Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,Page Object 的主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案 ...
- Spring实战第七章————SpringMVC配置的替代方案
SpringMVC配置的替代方案 自定义DispatherServlet配置 我们之前在SpittrWebAppInitializer所编写的三个方法仅仅是必须要重载的abstract方法.但还有更多 ...
- cpp语言程序设计教程第七章的一道编程题
题目如下 按下列要求实现一个有关学生成绩的操作. 该类名为Student. (1)每个学生的信息包含有姓名(字符数组)和成绩(int型). (2)共有5个学生,用对象数组表示. (3)计算出5个学生中 ...
- Python 3 学习笔记之——数据类型
1. 数字 类型 int, float, bool, complex type() 查看变量类型 isinstance(a, int) 查看变量类型 运算符 % 取余 // 返回商的整数部分 ** 幂 ...