理解至上:数位dp(ybtoj-B数计数)

文章目录

  • 简要
  • 题目描述
  • 解析
    • dp定义:
    • 试填法
  • 代码
  • thanks for reading!

简要

数位dp,天下第一

最重要的应该有两个:
1.状态转移式的确定
2.试填法不断往后模拟
至今是唯一一道数位dp,究竟重要的是啥我其实也没有太多经验
半年之后的UPD:为什么要试填法啊!!记搜天下第一!
至少这道题提供了很好的方法与套路

题目描述

在这里插入图片描述

解析

dp定义:

pos:表示位数
res:表示膜13的余数
op:表示关于出现13的状态,其中:

op=0: 啥也没有
op=1:没有出现13但最高位是3(再来个1就ok啦!)
op=2:已经存在13了

dp[pos][res][op]就是表示符合上述状态的数的数量
具体状态转移见代码

试填法

比当前最高位(设为s)小的后面可以随便填
若本位填了s就不断向后模拟,注意op(这里op=1的定义是最后一位是1)和res随着填数的转移
大于s自然不能填啦
注意:这么填最后会填到n-1,所以要么一开始就把n+1,要么特判一下n

代码

(数位dp法)

#include<bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int N=2e6+100;
const int M=2e6+100;
int dp[12][15][5],mi[15];
int a,m;
void Dp(){//预处理dpmi[0]=1;for(int i=1;i<=9;i++) mi[i]=mi[i-1]*10;dp[0][0][0]=1;for(int pos=1;pos<=10;pos++){//从后往前填 for(int i=0;i<=9;i++){for(int res1=0;res1<=12;res1++){int res2=(res1+13-i*mi[pos-1]%13)%13;if(i!=1&&i!=3) dp[pos][res1][0]+=dp[pos-1][res2][1];if(i!=3) dp[pos][res1][0]+=dp[pos-1][res2][0];if(i==3){dp[pos][res1][1]+=dp[pos-1][res2][0]+dp[pos-1][res2][1];}if(i==1) dp[pos][res1][2]+=dp[pos-1][res2][1];dp[pos][res1][2]+=dp[pos-1][res2][2];}}}
}
int solve(int n){//试填法int op=0,res1=0,ans=0;for(int pos=10;pos>=1;pos--){//从前往后填 int s=n/mi[pos-1];for(int i=s-1;i>=0;i--){//s以下自由填 int op2,resnow=(res1+i*mi[pos-1])%13,res2=(13-resnow)%13;//res2是后面需要的模数if(op==2||(op==1&&i==3)) op2=2;else if(i==1) op2=1;else op2=0;ans+=dp[pos-1][res2][2];if(op2) ans+=dp[pos-1][res2][1];if(op2==2) ans+=dp[pos-1][res2][0]; }if(op!=2){if(op==1&&s==3) op=2;else if(s==1) op=1;else op=0;}res1=(res1+s*mi[pos-1])%13;n%=mi[pos-1];} 
//	if(op==2&&res1==0) ans++;
//这里的特判和下面的a+1有一个即可return ans;
}
int main(){Dp();while(scanf("%d",&a)!=EOF){printf("%d\n",solve(a+1));}return 0;
}
/*
13
100
200
1000
*/

thanks for reading!

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

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

相关文章

2021“MINIEYE杯”中国大学生算法设计超级联赛(10)Pty loves string(Border+二维数点)

Pty loves string 建立Border树后&#xff0c;发现可以转化成两个子树中相同点的数量&#xff0c;时间戳转化为连续的区间后相当于有两个数组&#xff0c;每次给两个区间&#xff0c;问区间相同点权的数目。 第一个数组作为区间&#xff0c;第二个数组作为权值。将第一个数组建…

微软推出了Cloud Native Application Bundles和开源ONNX Runtime

微软的Microsoft Connect(); 2018年的开发者大会 对Azure和IoT Edge服务进行了大量更新; Windows Presentation Foundation&#xff0c;Windows Forms和Windows UI XAML Library的开源 以及.NET 基金会会员模型的扩展。但那些只是冰山一角。微软还联合Docker发布了Cloud Native…

不止代码:友好城市(动态规划)

解析 先按左端点排序得到一个右端点的新队列&#xff0c;然后就可以发现&#xff1a; 所有合法的方案都是新队列的一个单调递增队列 然后就转化成了最长上升序列的问题 代码 #include<bits/stdc.h> using namespace std; const int N1e6100; int m,n; struct node{int…

二分图匹配(一)

文章目录什么是二分图&#xff1a;例题&#xff1a;NC111768 CF741C题目描述&#xff1a;题解&#xff1a;代码&#xff1a;二分图最大匹配匈牙利算法算法思想&#xff1a;代码&#xff1a;Knig定理二分图最优匹配KM(Kuhn-Munkres)算法算法思路&#xff1a;具体操作代码&#x…

不止代码:恐狼后卫(ybtoj-区间dp)

文章目录题目描述解析代码thanks for reading!题目描述 一代炉石的眼泪啊 解析 用dp[i][j]表示i与j之间的全部消掉&#xff08;不含两端&#xff09;的最小花费 然后枚举中间最后杀死的狼就行了 本题没有一次AC&#xff0c;因为一开始dp定义成了包含两端&#xff0c;然后因为…

牛客题霸 [二叉树的之字形层序遍历] C++题解/答案

牛客题霸 [二叉树的之字形层序遍历] C题解/答案 题目描述 给定一个二叉树&#xff0c;返回该二叉树的之字形层序遍历&#xff0c;&#xff08;第一层从左向右&#xff0c;下一层从右向左&#xff0c;一直这样交替&#xff09; 例如&#xff1a; 给定的二叉树是{3,9,20,#,#,15…

【.NET Core项目实战-统一认证平台】第九章 授权篇-使用Dapper持久化IdentityServer4...

上篇文章介绍了IdentityServer4的源码分析的内容&#xff0c;让我们知道了IdentityServer4的一些运行原理&#xff0c;这篇将介绍如何使用dapper来持久化Identityserver4&#xff0c;让我们对IdentityServer4理解更透彻&#xff0c;并优化下数据请求&#xff0c;减少不必要的开…

不止代码:生日欢唱(ybtoj-区间dp)

文章目录题目描述解析代码thanks for reading&#xff01;题目描述 解析 这题挺好的 思路&#xff1a;dp[i][j]表示必须把i和j配对&#xff0c;可达到的最大值 首先&#xff1a; dp[i][j]dp[i-1][j-1]a[i]*b[j];然后可以分别尝试把男生或女生往前放弃一段&#xff1a; for(i…

打造自己的.NET Core项目模板

前言每个人都有自己习惯的项目结构&#xff0c;有人的喜欢在项目里面建解决方案文件夹&#xff1b;有的人喜欢传统的三层命名&#xff1b;有的人喜欢单一&#xff0c;简单的项目一个csproj就搞定。。反正就是萝卜青菜&#xff0c;各有所爱。可能不同的公司对这些会有特定的要求…

超好用的C#控制台应用模板

默认模板之缺在工作学习中&#xff0c;我们经常需要创建一些简单的控制台应用(Console App)去验证某个想法&#xff0c;或者作为小工具交付给其他同事。通常我们的选择是 Visual Studio 自带的 Console App 模板&#xff0c;这个经典模板只有预设好的 csproj 文件和空荡荡的 Ma…

不止代码:区间圆数(ybtoj-数位DP)

文章目录题目描述解析理解万岁&#xff01;代码题目描述 解析 一寸山河一寸血 理解万岁&#xff01; 首先&#xff0c;这题统计[l,r]的个数&#xff0c;可以用[1,r]-[1,l-1]来实现 接下来就是如何统计出[1,n]的个数了 首先&#xff0c;用dp[pos][s0]来表示一个二进制pos位有s…

.NET Core 2.2 新增部分功能使用尝鲜

前言美国当地时间12月4日&#xff0c;微软2019开发者大会中发布了一系列的重磅消息&#xff0c;包含了软硬件和开源社区的各种好消息是铺天盖地&#xff0c;作为一名普通的开发者&#xff0c;我第一时间下载了 .NET Core 2.2 的源码&#xff0c;针对发布说明逐条浏览&#xff0…

不止代码:机器分配(动态规划)

题目描述 解析 头疼 什么破题 就是一个dp寻找最优性决策的常规题 但是要输出过程&#xff0c;可以使用递归输出 但是&#xff01; 这题数据的意思是&#xff1a;存在a[i]a[i1]的情况&#xff0c;且在不影响利润的情况下&#xff0c;机器要尽可能的用完 这河里吗 可能是机器多了…

2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛 GCD on Sequence(线段树)

https://blog.csdn.net/qq_45863710/article/details/120121607 对于每个左端点 l 维护尚未确定 v 值的最大的右端点 mx[l] #include<bits/stdc.h>using namespace std; using lllong long; const int N100010; vector<int> vec[N]; int n,a[N],p[N]; ll ans[N]; …

Docker最全教程——从理论到实战(六)

本篇教程持续编写了3个星期左右并且一直在完善、补充具体的细节和实践&#xff0c;预计全部完成需要1到2个月的时间。由于编写的过程中极其费时&#xff0c;并且还需要配合做一些实践&#xff08;有些实践存在一些坑&#xff0c;而且极其费时费事&#xff09;。因此目前产出的速…

.NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程

写在前面上一篇文章.NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程中我带着大家进行了权限部分的极简设计&#xff0c;也仅仅是一个基本的权限设计。不过你完全可以基于这套权限系统设计你的更复杂的权限系统&#xff0c;当然更复杂的权限系统要根据你的业务来进…

2021“MINIEYE杯”中国大学生算法设计超级联赛(2)I love max and multiply(转化)

I love max and multiply Code 代码抄的std #include<bits/stdc.h> using namespace std; using lllong long; template <class Tint> T rd() {T res0;T fg1;char chgetchar();while(!isdigit(ch)) {if(ch-) fg-1;chgetchar();}while( isdigit(ch)) res(res<&…

人工智能第二课:认知服务和机器人框架探秘

这是《人工智能系列笔记》的第二篇&#xff0c;我利用周六下午完成课程学习。这一方面是因为内容属于入门级&#xff0c;并且之前我已经对认知服务和机器人框架比较熟悉。如有兴趣&#xff0c;请关注该系列 https://aka.ms/learningAI 但是学习这门课程还是很有收获&#xff0c…

粉刷木板(ybtoj-单调队列)

题目描述 解析 头疼 定义dp[i]:只用前i块板的最大价值 对于新加入的一个木匠&#xff1a; 不难写出dp转移式&#xff1a; dp[i]max(dp[k](i-k)*p)k表示开始刷的前一个 其中i>s i-k<l; 要是这么转移会是n^2m 所以我就不废了。。。 其实离正解很接近了 把上面移一下项&am…

使用Dapper持久化IdentityServer4

最近研究dotnet core,微软将IdentityServer4作为推荐的服务授权和验证的组件,其独立性特别适合微服务或者分布式的服务扩展验证,所以非常受广大dotnet开发人员的青睐.默认的IdentityServer4默认使用内存对象的验证和授权,而在IdentityServer的官方推荐只有Entity Framework cor…