首页 > 其他分享 >数位DP及模板

数位DP及模板

时间:2023-01-24 15:55:17浏览次数:41  
标签:int dp pos zero DP define 模板 数位

数位DP:

一般来说数位DP有两种写法:1.for循坏枚举DP 2.记忆化搜索+DP

这里详细将记忆化搜索+DP

DFS状态:

常见的dfs状态有三个:

1.枚举到第几位(POS)

2.判断前面是否紧贴上限(LIMIT)

3.前面的数是否全为前导0 (ZERO)

 

这三个状态如何转移到下一位呢?

1.pos→pos+1

2.limit→limit&&a[i]=当前这位最高位

3.zero→zero&&a[i]=0

 

重点:dfs的核心是深搜,一搜搜到底,搜到底了,代表我们搜完了一个数,return 1;

 

 

 

现在问有多少的数比12345小

1.关于前导0:00999→999,09999→9999

2.关于limit前面的数是否紧贴上限

如果前面的数是紧贴上限的,当前这位枚举的上限便是当前数的上限

如果前面的数不是紧贴上限的,当前这位枚举的上限便是 9

3.关于记忆化DP

现在枚举到了 10××× 和 11×××

显然 这两种状态后面的×××状态数是一样的,我们只用枚举一次,再碰到直接return值就好了

4.关于DP维度

一般来说,DFS有几个状态,DP就几个维度  

比如现在DP就是DP [pos] [limt] [zero] 

5.关于DP细节

一般来说我们一开始都memset(dp,-1,sizeof(dp))

如果dp[pos][limt][zero]!=-1 return dp[pos][limit][zero];

6.关于初始化:

一开始 limit 是1,表示一开始的数只能选 1~a[1]

一开始zero 是1,假定表示前面的数全为0

 

最后放个数位DP模板:(询问 L~R 之间有多少的数)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back   //vector函数
#define popb pop_back  //vector函数
#define fi first
#define se second
const int N=20;
//const int M=;
//const int inf=0x3f3f3f3f;     //一般为int赋最大值,不用于memset中
//const ll INF=0x3ffffffffffff; //一般为ll赋最大值,不用于memset中
int T,n,len,a[N],dp[N][2][2];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int dfs(int pos,bool lim,bool zero)
{
    if(pos>len) return 1;
    if(dp[pos][lim][zero]!=-1) return dp[pos][lim][zero];
    int res=0,num=lim?a[pos]:9;
    for(int i=0;i<=num;i++)
        res+=dfs(pos+1,lim && i==num,zero && i==0 );
    return dp[pos][lim][zero]=res; 
} 
int solve(int x)
{
    len=0;
    memset(dp,-1,sizeof(dp));
    for(;x;x/=10) a[++len]=x%10;
    reverse(a+1,a+len+1);
    return dfs(1,1,1);
}
int main()
{
//    freopen("","r",stdin);
//    freopen("","w",stdout);    
    int l=read(),r=read();
    printf("%d\n",solve(r)-solve(l-1));
    return 0;
}

 

标签:int,dp,pos,zero,DP,define,模板,数位
From: https://www.cnblogs.com/Willette/p/17066100.html

相关文章

  • vmhost永久免费主机搭建wordpress
    vmhost主机试用+worpress搭建点击vmhost进入vmhost官网,vmhost提供了永久免费的主机,还附带一个三级域名,并且支自定义子域名,免费托管5G的网页空间,网页支持php语言,附带数据......
  • P3802 小魔女帕琪 题解【期望dp】
    题目传送门P3802解题思路本题的解题思路关键在于分段。每一个结构段的概率在之后的结构段依然适用。判断是否符合这种特性最好方法是随机截取一段观察是否成立发现成......
  • WeetCode4 —— 二叉树遍历与树型DP
    一丶二叉树的遍历1.二叉树遍历递归写法与递归序了解过二叉树的朋友,最开始肯定是从二叉树的遍历开始的,二叉树遍历的递归写法想必大家都有所了解。publicstaticvoidpro......
  • Python的UDP网络编程
    UDP编程通信协议有,UDP和TCP模式:1、TCP适用于效率较低,精度较高的场景(文件传输、电子邮件)2、UDP适用于效率较高(视频在线点播,网络语音通话等)接下来的代码介绍的是UDP协议......
  • 【dp专题】概率与期望dp
    基本概念与基础数学知识数学知识:概率与期望简单的对概率期望做理解性的解释。概率就是某一件事发生的可能性。注意对某两件事是否是相同一件事的判定。这件事的发生可......
  • 【题解】P5787 二分图 /【模板】线段树分治
    概念线段树分治是一种用于维护时间轴等的离线算法,本质上是通过维护时间轴的连续区间得到某一时刻的状态。时间复杂度和普通线段树相同,空间复杂度为\(O(n\logn)\)例题......
  • LeetCode最长回文子串(/dp)
    原题解题目约束解法解法一#include<iostream>#include<string>#include<vector>usingnamespacestd;classSolution{public:stringlongestPa......
  • 网络分层 & http & tcp or udp
    ......
  • 【总结】DP的常用优化
    1.单调队列优化2.斜率优化2.1.算法介绍如果一类\(dp\)可以写为\(f_i=\max/\min{a_i\cdotb_j+c_j+d_i}\),即只和\(i\),\(j\)有关的项和一个和\(i\),\(j\)......
  • Trick 11:区间 DP 杂题选讲
    大家好,下面讲的题目一个都不会,但是我脸皮很厚,所以分享给大家了。搁前面说一句:做题的时候能不能别丢掉这个算法啊!试一下啊!Pro.1P7914这是一个练手题。我们先来说说括号......