向大佬学习

第一次写博客有点紧张,也算是小萌新的突破吧

这次主要是总结一下校内的ACM比赛的各种题,主要是新思路以及学到的新知识

先放一张

下面开始说正事

题面

A wqb-number, or B-number for short, is a non-negative integer whose decimal form contains the sub- string “13” and can be divided by 13. For example, 130 and 2613 are wqb-numbers, but 143 and 2639 are not. Your task is to calculate how many wqb-numbers from 1 to n for a given integer n.

Input

Process till EOF. In each line, there is one positive integer n(1 <= n <= 1000000000).

Output

Print each answer in a single line.

Sample Input

13

100

200

1000

Sample Output

1

1

2

2

乍眼一看,像极了数位dp,可是怎么判断是否能被13整除呢?之前学过做过的数位dp的限制条件都是有没有包含某数、不包含某数等。这告诉我们需要新思维了。

我们来回想一下普通的数位dp

ll dfs(int pos,,bool lead,bool limit)
{
if(pos==-1) return 1;
if(!limit && !lead && dp[pos][state]!=-1) return dp[pos][state]; int up=limit?a[pos]:9;
ll ans=0;
for(int i=0;i<=up;i++)
{
if() ...
else if()...
ans+=dfs(pos-1,,lead && i==0,limit && i==a[pos])
}
if(!limit && !lead) dp[pos][state]=ans;
return ans;
}

其实就是记忆化搜索,其中dp[]表示第pos位的state状态,之所以可以直接调用返回,是因为不管前面的位怎么搞,只要符合第pos位的state状态,后面的情况就都定了,所以只需算一次,储存以后直接调用(limit==1要单独计算,以前就在这里挂了)

那么现在重点来了,state是一个很是重要的突破点,以前的思维就局限在“13”出现过没有,而处理能否被13整除,即为 i mod 13 == 0

所以dp数组就确定了: dp[i][j][k],i表示第i位,j=0,1,2,j=0表示还没有出现过“13”,j=1表示前一位是“1”,j=2表示已经出现了“13”,k表示当前的数mod13的值。

转移方程:

1、j=0,(1)该位为“1”,下传j=1;(2)不为“1”,下传j=0

2、j=1,(1)“3”,j=2:(2)“1”,j=1;(3)else,j=0;

3、j=2,直接下传j=2

4、k=(k*10)% 13(想想为什么)

然后就显而易见了

下面放代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; char a[15];
int b[15],len;
int dp[15][3][13]; int dfs(int pos,bool limit,int appr,int mod,bool lead){//注意还要判断前导零的问题
if(pos==len+1){
if(appr==2&&mod==0&&lead==0) return 1;
else return 0;
}
if((!limit)&&dp[pos][appr][mod]!=-1) return dp[pos][appr][mod];
int up=limit?b[pos]:9;
int ans=0;
for(int i=0;i<=up;i++){
if(appr==0){
if(i==1) ans+=dfs(pos+1,(limit==1&&i==up),1,(mod*10+i)%13,(i==0&&lead==1));
else ans+=dfs(pos+1,(limit==1&&i==up),0,(mod*10+i)%13,(i==0&&lead==1));
}
if(appr==1){
if(i==3) ans+=dfs(pos+1,(limit==1&&i==up),2,(mod*10+i)%13,(i==0&&lead==1));
else if(i==1) ans+=dfs(pos+1,(limit==1&&i==up),1,(mod*10+i)%13,(i==0&&lead==1));
else ans+=dfs(pos+1,(limit==1&&i==up),0,(mod*10+i)%13,(i==0&&lead==1));
}
if(appr==2) ans+=dfs(pos+1,(limit==1&&i==up),2,(mod*10+i)%13,(i==0&&lead==1));
}
if(!limit) dp[pos][appr][mod]=ans;
return ans;
}
int main(){
while(scanf("%s",a+1)!=EOF){
len=strlen(a+1);
for(int i=1;i<=len;i++){
b[i]=a[i]-'0';
}
memset(dp,-1,sizeof(dp));
int ans=dfs(1,1,0,0,1);
printf("%d\n",ans);
}
return 0;
}

总结:

对数位dp有了更新的认识,各种不同的限制条件可以化为多个state,state是状态,不只是出现了什么数字而已

【hdu3652】数位dp(浅尝ACM-A)的更多相关文章

  1. HDU3652(数位dp)

    A - B-number Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descri ...

  2. hdu3652 数位dp记忆化搜索

    从未见过的船新版本数位dp,,省去了预处理过程,直接进行计算 #include<bits/stdc++.h> using namespace std; #define ll long lo ...

  3. 数位dp浅谈(hdu3555)

    数位dp简介: 数位dp常用于求区间内某些特殊(常关于数字各个数位上的值)数字(比如要求数字含62,49): 常用解法: 数位dp常用记忆化搜索或递推来实现: 由于记忆化搜索比较好写再加上博主比较蒟, ...

  4. hdu3652(数位dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意:求1~n含有13且能被13整除的数的个数. 分析:数位dp,dp数组加一维来维护到pos位 ...

  5. hdu3652 B-number 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3652 题意就是求区间内能被13整除并且包含”13“的数字的个数 感觉是比较中等的数位DP题目 我用的记 ...

  6. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位dp)

    题目链接:https://ac.nowcoder.com/acm/contest/163/J 题目大意:给定一个数N,求区间[1,N]中满足可以整除它各个数位之和的数的个数.(1 ≤ N ≤ 1012 ...

  7. 哈尔滨工程大学ACM预热赛 G题 A hard problem(数位dp)

    链接:https://ac.nowcoder.com/acm/contest/554/G Now we have a function f(x): int f ( int x ) {     if ( ...

  8. 2018牛客网暑假ACM多校训练赛(第四场)C Chiaki Sequence Reloaded (组合+计数) 或 数位dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-C.html 题目传送门 - https://www.no ...

  9. 【ACM】不要62 (数位DP)

    题目:http://acm.acmcoder.com/showproblem.php?pid=2089 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新 ...

随机推荐

  1. 珍藏版 Python 开发工程师面试试题

    珍藏版 Python 开发工程师面试试题 说明:不拿到几家公司的offer,那就是卑鄙的浪费 一.Python_基础语法 1.可变与不可变类型: 2.浅拷贝与深拷贝的实现方式.区别:deepcopy如 ...

  2. Linux认知之旅【06 图形界面上的各种折腾】!

    玩linux免不了折腾,不折腾对不起linux 初次接触, 总会接触到绚丽的linux桌面! 但是随之而来的桌面优化,字体安装,操作习惯都需要一一适应

  3. hp raid json

    hp机器均已在装OS之前划好raid,统一规格为2*480G SSD, 12*4T SATA ,2*1.6T SSD,其中2*480G SSD做系统盘,划分raid1 已知disk controlle ...

  4. centos7系列问题

    一.CentOS7.1查看ip route有两条路由规则 1.metric值是指到达目的地需要的跳数,是表达该条路由连接质量的指标.当有多条到达相同目的地的路由记录时,路由器会采用metric值小的那 ...

  5. .NET Core Linux 部署实践

    部署环境:CentOS 7 x64 必要条件:当前用户有sudo权限 1. 安装依赖包sudo yum install libunwind libicu2. 下载.net core安装文件curl - ...

  6. StringBuilder_学习笔记

    参考:https://www.jianshu.com/p/160c9be0b132 连接符号 "+" 本质 字符串变量(非final修饰)通过 "+" 进行拼接 ...

  7. java中TCP总结

    先看一张图,画的很挫,将就看. TCP 客户端与服务端通信时,是服务端会拿到客户端的socket进行通信. TCP就相当于以前的座机,有一个听筒和一个话筒,A用话筒说话,B用听筒听. 下面讲讲java ...

  8. RHEL退出RHN

    清除原有数据 rm -rf /etc/sysconfig/rhn/rhn_systemidrm -rf /var/cache/yum/*yum clean all 加载刷新源 yum repolist ...

  9. 【转】shell脚本写的俄罗斯方块游戏

    亲测一个很好玩的shell脚本写的俄罗斯方块游戏,脚本来自互联网 先来讲一下思维流程 一.方块的表示 由于shell不能定义二维数组,所以只能用一维数组表示方块,俄罗斯方块主要可以分为7类,每一类方块 ...

  10. JAVA下几个问题

    一.Server MyEclipse Tomcat v8.5 was unable to start within 45 seconds. If the server requires more ti ...