数位DP,即对数位进行拆分,利用数位来转移的一种DP,一般采用记忆化搜索,或者是先预处理再进行转移

一个比较大略的思想就是可以对于给定的大数,进行按数位进行固定来转移记录答案

区间类型的,可以考虑前缀和的思想,求[l,r]可以看做求[1,r]-[1,l)

其实还有一种,是按照二进制建一颗0,1树来表示,来做,但是比并没有做过,以后再总结

HDU-2089

题目大意:对于区间[L,R]求有多少不包含'62'且不包含'4'的数,题目允许有前导零

思路:

数位DP,考虑F[i][j]表示位数为i,最高位为j的满足的个数

预处理后,统计答案即可,统计答案大致就是固定每一位,进行统计

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
int n,m;
int F[][];
void prework()
{
F[][]=;
for (int i=; i<=; i++)
for (int j=; j<=; j++)
for (int k=; k<=; k++)
if (j!= && !(j==&&k==))
F[i][j]+=F[i-][k];
}
int Calc(int x)
{
int digit[]={},len=,ans=;
while (x!=) {digit[++len]=x%; x/=;}
for (int i=len; i>=; i--)
{
for (int j=; j<=digit[i]-; j++)
if (j!= && !(j==&&digit[i+]==))
ans+=F[i][j];
if (digit[i]== || (digit[i]==&&digit[i+]==)) break;
}
return ans;
}
int main()
{
prework();
n=read(),m=read(); if (n>m) swap(n,m);
while (n!= && m!=)
{
printf("%d\n",Calc(m+)-Calc(n));
n=read(),m=read(); if (n>m) swap(n,m);
}
return ;
}

HDU-3652

题目大意:给定n,求到n中,包含'13'且被13整除的数的个数

思路:

设计状态F[i][j][k][0/1]表示位数为i,最高位为j的%13余k的数字包含和不包含13的个数

那么同样预处理,这里不含前导零,需要额外做一个值去进行计算,计算到n以内的,计算n+1即可

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
long long n;
long long F[][][][];
long long cf(int x,int y)
{
long long re=x;
for (int i=; i<y; i++) re*=;
return re;
}
void prework()
{
for (int i=; i<=; i++) F[][i][i%][]=;
for (int i=; i<=; i++)
for (int tmp,j=; j<=; j++)
{
tmp=cf(j,i-);
for (int k=; k<=; k++)
for (int l=; l<; l++)
{
F[i][j][(tmp+l)%][]+=F[i-][k][l][];
if (j== && k==)
F[i][j][(tmp+l)%][]+=F[i-][k][l][];
else
F[i][j][(tmp+l)%][]+=F[i-][k][l][];
}
}
// for (int i=1; i<=10; i++)
// for (int j=0; j<=9; j++)
// for (int k=0; k<13; k++)
// printf("%I64d %I64d\n",F[i][j][k][1],F[i][j][k][0]);
}
long long Calc(long long x)
{
int digit[]={},len=,f=; long long ans=;
while (x) {digit[++len]=x%; x/=;}
for (int i=; i<=digit[len]-; i++)
ans+=F[len][i][][];
long long tmp=cf(digit[len],len-);
for (int tt,i=len-; i>=; i--)
{
for (int j=; j<=digit[i]-; j++)
for (int k=; k<; k++)
{
if ((tmp+k)%==) ans+=F[i][j][k][];
if ((tmp+k)%== && (digit[i+]== && j==))
ans+=F[i][j][k][];
else if ((tmp+k)%== && f) ans+=F[i][j][k][];
}
if (digit[i]== && digit[i+]==) f=;
tmp+=cf(digit[i],i-);
}
return ans;
}
int main()
{
prework();
while (scanf("%lld",&n)!=EOF)
printf("%lld\n",Calc(n+));
return ;
}

【学习笔记&训练记录】数位DP的更多相关文章

  1. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  2. 【学习笔记】动态规划—各种 DP 优化

    [学习笔记]动态规划-各种 DP 优化 [大前言] 个人认为贪心,\(dp\) 是最难的,每次遇到题完全不知道该怎么办,看了题解后又瞬间恍然大悟(TAT).这篇文章也是花了我差不多一个月时间才全部完成 ...

  3. 汇编入门学习笔记 (七)—— dp,div,dup

    疯狂的暑假学习之  汇编入门学习笔记 (七)--  dp.div.dup 參考: <汇编语言> 王爽 第8章 1. bx.si.di.和 bp 8086CPU仅仅有4个寄存器能够用 &qu ...

  4. 专题训练之数位DP

    推荐以下一篇博客:https://blog.csdn.net/wust_zzwh/article/details/52100392 1.(HDOJ2089)http://acm.hdu.edu.cn/ ...

  5. 2019年9月训练(壹)数位DP (HDU 2089)

    开学之后完全没时间写博客.... HDU 2089 不要62(vjudge) 数位DP 思路: 题目给出区间[n,m] ,找出不含4或62的数的个数 用一个简单的差分:先求0~m+1的个数,再减去0~ ...

  6. [学习笔记]搜索——模拟与dp的结合

    搜索: 一种基础的算法. 考察常见于NOIP 但是高级的搜索算法可能还会在省选出现. 50%以上的暴力都可以用搜索直接枚举来写. 但是,当数据规模不是很大的时候,搜索也可能成为正解. (比如剪枝PK状 ...

  7. 洛谷4719 【模板】动态dp 学习笔记(ddp 动态dp)

    qwq大概是混乱的一个题. 首先,还是从一个比较基础的想法开始想起. 如果每次暴力修改的话,那么每次就可以暴力树形dp 令\(dp[x][0/1]\)表示\(x\)的子树中,是否选择\(x\)这个点的 ...

  8. 「学习笔记」斜率优化dp

    目录 算法 例题 任务安排 题意 思路 代码 [SDOI2012]任务安排 题意 思路 代码 任务安排 再改 题意 思路 练习题 [HNOI2008]玩具装箱 思路 代码 [APIO2010]特别行动 ...

  9. [学习笔记]四边形不等式优化DP

    形如$f[i][j]=min{f[i][k]+f[k+1][j]}+w[i][j]$的方程中, $w[\;][\;]$如果同时满足: ①四边形不等式:$w[a][c]+w[b][d]\;\leq\;w ...

随机推荐

  1. h1/title,b/strong,i/em 的区别

    < strong > 表示html页面上的强调(emphasized text), < em > 表示句子中的强调(即强调语义) 1.b和strong的区别 盲人朋友使用阅读设 ...

  2. Windows 8.1 新增控件之 CommandBar

    上一篇为大家介绍了AppBar 的相关内容,本篇继续介绍CommandBar 的使用方法.与AppBar 相比而言,CommandBar 在开发使用方面较为单一,在按键布局上分为主控区(Primary ...

  3. Linux shell中的符号

    .单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用. 括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空 ...

  4. Theano2.1.7-基础知识之设置的配置和编译模式

    来自:http://deeplearning.net/software/theano/tutorial/modes.html Configuration Settings and Compiling ...

  5. 汤姆大叔的6道javascript编程题题解

    看汤姆大叔的博文,其中有篇(猛戳这里)的最后有6道编程题,于是我也试试,大家都可以先试试. 1.找出数字数组中最大的元素(使用Math.max函数) var a = [1, 2, 3, 6, 5, 4 ...

  6. MVC+EF 理解和实现仓储模式和工作单元模式

    MVC+EF 理解和实现仓储模式和工作单元模式 原文:Understanding Repository and Unit of Work Pattern and Implementing Generi ...

  7. APP架子迁移指南(二)

    接上一篇,这一篇开始用android来解释MVP概念.八股式的架子结构和命名规范.我在准备这篇文章的时候还看到不少在MVP基础上衍生的架子思路,底子是MVP没错,但命名有区别.复杂度变了.架子也用到了 ...

  8. Android开发自学笔记—1.1(番外)AndroidStudio常用功能介绍

    一.界面区介绍 1.项目组织结构区,用于浏览项目文件,默认Project以Android组织方式展示. 2.设计区,默认在打开布局文件时为设计模式,可直接拖动控件到界面上实现所见即所得,下方的Desi ...

  9. 2014 todo list

    1. 做好已知的各种项目,争取能成立固定团队2. 横向扩展技术学习,了解各种技术,加强技术素养3. 争取找个妹子4. 加强音律学习5. 继续发展各业余爱好6. 努力摇号 年底看收成.

  10. VS代码管理插件AnkhSvn

    下载AnKHSvn软件,启动VS,源代码管理工具选择AnKHSvn 在视图-〉其它窗口-〉Pending Change->提交变化的更改