数位dp学习笔记

news/2025/2/9 12:50:29/文章来源:https://www.cnblogs.com/hnczy/p/18706010

数位dp的标志:

  1. 要求统计满足一定条件的数的数量(即,最终目的为计数);
  2. 这些条件经过转化后可以使用「数位」的思想去理解和判断;
  3. 输入会提供一个数字区间(有时也只提供上界)来作为统计的限制;
  4. 上界很大(比如 $10^{18}$),暴力枚举验证会超时。

数位dp的模板题 A - 不要62

实现非常的简单,设计一个$dp[n][0/1]$ 选每一个数字的方案都记一下即可。

#include<bits/stdc++.h>
using namespace std;
int dp[15][2],vis[15][2];
int l,r,a[15];
int dfs(int len,int six,int lim){if(len==0)return 1;if(!lim&&vis[len][six])return dp[len][six];int res=0;for(int i=(lim?a[len]:9);i>=0;i--){if(i==4)continue;if(six&&i==2)continue;res+=dfs(len-1,i==6,lim&&i==a[len]);}if(!lim){vis[len][six]=1;dp[len][six]=res;}return res;
}
int solve(int x){if(x==0)return 1;int len=0;memset(a,0,sizeof a);while(x){a[++len]=x%10;x/=10;} return dfs(len,0,1);
}
int main(){while(~scanf("%d%d",&l,&r)){if(!l&&!r)break;printf("%d\n",solve(r)-solve(l-1));}return 0;
}

C - Round Numbers

这一道题记的状态有所改变,可以记 $dp[len][x][y]$ 表示在到 $len$ 这一个位置时,0的数量和1的数量分别是 $x$ 和 $y$ 当然如果你想省时间的话就可以记 $dp[len][x]$ 代表两者的差,注意差可能是负数,需要加上长度。

D - B-number

这道题记一下前面是否有 13 除 13 的余数转移即可。

E - Balanced Number

这一个题就很有意思了。需要你枚举每一个点,作为平衡点的情况,记一下两边力矩之差即可。

时间复杂度 $O(len^2*200)$

F - XHXJ's LIS

一道好题,代码不麻烦并且有一定的思维量。

首先复习 LIS 的求法,$O(n^2)$ 的求法很简单 , 但 $O(nlogn)$ 的求法用 LIS 的特点 ,即LIS长度越长,他的最末的数越大。

而且我们发现这里的数码只有 10 个,那我们是否可以使用状压的方法,来压一下每一个数是否在LIS

中出现,在每一次转移时,往st里添加这个数(当然这一个步骤需要预处理) 即可。

G - Beautiful numbers

数感题,很容易发现,其实这个各个数位的积上限时很少的,好像只有 2520,所以就跟 D - B-number 这一题一样了,就只要最后的时候对答案检查一下即可。

因为$k \mod2520 \mod s =k\mod s$

I - 吉哥系列故事——恨7不成妻

数学推导题,推一下 $sqsum$ 与 $sum$ 和 $cnt$ 的关系即可。

K - Matches Puzzle Game

把等式改为加式,记$dp[x][b][c][flag]$ 表示剩余火柴,$b,c$ 是否到顶,是否有进位。

这样的数位dp 不算很明显,需要进行一定的转化才可以变成一般的数位dp。

#include<cstdio>
#include<cstring>
#define int long long
using namespace std;
const int num[]= {6,2,5,5,4,5,6,3,7,6};
int n,mod,T;
int dp[505][2][2][2];
bool vis[505][2][2][2];
int dfs(int x,bool b,bool c,bool flag) {if(x<0)return 0;//不能堆叠了if(b&&c)return x==flag*2;if(vis[x][b][c][flag])return dp[x][b][c][flag];int res=0;if(b) {for(int i=0; i<=9; i++) {res+=dfs(x-num[i]-num[(i+flag)%10],1,0,(flag+i)/10);res%=mod;if(i)res+=dfs(x-num[i]-num[(i+flag)%10],1,1,(flag+i)/10);res%=mod;}} else if(c) {for(int i=0; i<=9; i++) {res+=dfs(x-num[i]-num[(i+flag)%10],0,1,(flag+i)/10);res%=mod;if(i)res+=dfs(x-num[i]-num[(i+flag)%10],1,1,(flag+i)/10);res%=mod;}} else {for(int i=0; i<=9; i++) {for(int j=0; j<=9; j++) {int tmp=i+j+flag;res+=dfs(x-num[i]-num[tmp%10]-num[j],0,0,tmp/10);res%=mod;if(i)res+=dfs(x-num[i]-num[tmp%10]-num[j],1,0,tmp/10);res%=mod;if(j)res+=dfs(x-num[i]-num[tmp%10]-num[j],0,1,tmp/10);res%=mod;if(i&&j)res+=dfs(x-num[i]-num[tmp%10]-num[j],1,1,tmp/10);res%=mod;}}}vis[x][b][c][flag]=1;return dp[x][b][c][flag]=res;
}
//时间复杂度O(500*3*2*100)
//分别表示在 x:剩余的木棍与 A需要的木棍的差 cnt: B C的暂停个数 (B C 等价) flag上一次有没有进位
//17 14 01+11=12
//细节 从小到大的堆放
signed main() {scanf("%lld",&T);int t=0;while(T--) {memset(vis,0,sizeof vis);memset(dp,0,sizeof dp);scanf("%lld%lld",&n,&mod);printf("Case #%lld: %lld\n",++t,dfs(n-3,0,0,0));}return 0;
}

对于数位dp 有三种求的量:最一般的就是求方案数,也有求和的,需要记一下每一个数的出现的个数,用这一个辅助数组进行最终的求值,当然还有求平方和的,这需要方案数,求和数组,共需要开三个数组才可以解决,详情可看I - 吉哥系列故事——恨7不成妻。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881202.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【烂笔头系列】推荐系统笔记05-Embedding技术

1. Embedding是什么 Embedding 就是用一个数值向量“表示”一个对象(Object)的方法解读1:左边例子,从 king 到 queen 的向量和从 man 到 woman 的向量,无论从方向还是尺度来说它们都非常接近。 解读2:右边例子也很典型,从 walking 到 walked 和从 swimming 到 swam 的向…

【烂笔头系列】推荐系统笔记04-推荐系统有哪些可以利用的特征

1. 特征与工程 (1)特征就是对具体行为的抽象,但是抽象过程会造成信息的损失 ① 因为具体的推荐行为和场景中包含大量原始的场景、图片和状态信息,保存所有信息的存储空间过大,我们根本无法实现。 ② 因为具体的推荐场景中包含大量冗余的、无用的信息,把它们都考虑进来甚至…

1.AI 大模型的基本概念

1.目前AI 行业分类 2023年, AI 分 传统AI(机器学习、深度学习、强化学习) AI算法工程师 AI大模型(AI2.0)神经网络,自注意机制,Transform机制 AI应用开发工程师 2.什么是AI 大模型(LLM) 参数大,训练的数据集大 3.AI大模型最终价值 TOB 和 TOC 的应用 4.A…

【烂笔头系列】小红书推荐系统学习笔记06-冷启动

物品冷启动评价指标 物品冷启动目标精准推荐:新物品的推荐效果往往比较差 激励发布:新物品得到较多流量后,更容易激励作者。 挖掘高潜:从新物品中挖掘高质量物品。评价指标作者指标:发布渗透量、人均发布量等 用户指标:新笔记的交互率、大盘指标(比如日活、月活、时长)…

【烂笔头系列】小红书推荐系统学习笔记05-重排

重排是精排的后处理操作。 物品多样性 相似度度量基于物品属性标签基于物品向量表征 (1)双塔模型的物品塔,但是因为头部效应问题导致学不好物品向量表征 (2)基于图文内容学习CLIP - 基于图文内容的物品向量表征 原理 对于图片-文本二元组数据进行对比学习,预测图文是否匹…

小红书推荐系统学习笔记02-排序

精排 - 多目标模型 简单的多目标模型 模型结构损失函数和训练问题 数据集通常是类别及不平衡的,比如总共1000次曝光,其中只有100次点击,10次收藏,收藏次数对于曝光来说相差极大。 解决方案:通常使用负样本降采样的方法。 预估校准:负样本降采样之后,就改变了各个目标的实…

【烂笔头系列】小红书推荐系统学习笔记04-行为序列

简单平均 lastN特征 把用户最近n次交互的物品Embedding向量取平均,作为一个用户特征使用。 适用于召回双塔模型、粗排三塔模型、精排模型。 DIN 原理 本质:用加权平均代替平均,也就是注意力机制。注意力机制不适用于召回双塔和粗排三塔。因为需要用到候选物品,而用户塔看不…

dp 大典

作为 OI 里面分支最多的模块之一,dp 在 OI 中有着重要的作用,现在,让我们一起走进 dp 的世界: 注:我在每道题前面都标注了个人难度,范围大概是 \([1,50]\) 吧( AT_dp 系列 众所周知,Atcoder 中有一套全是 dp 的题目,难度大致逐渐增加,我们可以从中学到很多 dp 的知识…

htb Precious walkthrough

找到exp https://github.com/UNICORDev/exploit-CVE-2022-25765/blob/main/exploit-CVE-2022-25765.py 这个exp是有问题的 直接执行exp是没反应把他的payload cp出来手动粘贴到 框框里 然后就反弹shell成功flag在另一个用户里面 进过一番查找 在家目录的.bundle里的文件发现了…

Element简单组件开发

Element简单组件开发 1.项目创建 需要的环境:webStorm,NodeJS 创建一个工程化的Vue项目,在创建工程的文件夹中打开CMD命令窗口,执行命令:npm create vue@3.3.4 (3.3.4是我们安装Vue的版本)详细步骤说明: - Project name:------------------》项目名称,默认值:vue-proj…

⑨也能看懂的 nginx 与 C++ 简易版集成

原理概述 nginx 运行在端口A,转发数据给端口B,C++ 监听端口B的数据。 本文例子 使用 C++ 和 nginx 获取客户端的IP地址 代码 nginx 配置 #user nobody; worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/…

探秘Transformer系列之(1):注意力机制

探秘Transformer系列之(1):注意力机制 0x00 概述 因为各种事情,好久没有写博客了,之前写得一些草稿也没有时间整理(都没有时间登录博客和微信,导致最近才发现好多未读消息和私信,在这里和各位朋友说下万分抱歉)。现在恢复更新,是因为最近有些从非AI领域转过来的新同学…