hdu 3652 B-number(数字dp)

hdu 3652 B-number(数字dp)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

http://acm.hdu.edu.cn/showproblem.php?

pid=3652

大致题意:”B-number“即一个整数含有子串”13″且被13整除。求1-n之间这种数的个数。


思路:有两个限制条件:含有子串“13”和能被13整除。

那么设dp[site][mod][flag]。表示到第site位对13取余为mod且标记为flag的数的个数。flag表示是否含有子串”13″。

然后进行记忆话搜索。


#include <stdio.h>
#include <iostream>
#include <map>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-8
#define PI acos(-1.0)
using namespace std;

int dp[15][15][5];
int dig[15];
//flag = 0表示前一个不是1,flag = 1表示前一个是1。flag = 2表示出现"13"。

int dfs(int site, int mod, int flag, int up){ if(site == 0) return mod == 0 && flag == 2; //当mod为0且有"13"时。返回1 if(!up && dp[site][mod][flag] != -1)//记忆化 return dp[site][mod][flag]; int len = up ?

dig[site] : 9; int ans = 0; for(int i = 0; i <= len; i++) { int tmod = (mod*10 + i) % 13; int tflag = flag; if(flag == 1 && i == 3) tflag = 2; else if(flag == 0 && i == 1) tflag = 1; else if(flag == 1 && i != 1) tflag = 0; ans += dfs(site-1, tmod, tflag, up && (i == len) ); } if(!up) dp[site][mod][flag] = ans; return ans;}int cal(int n){ int cnt = 0; while(n) { dig[++cnt] = n % 10; n /= 10; } memset(dp,-1,sizeof(dp)); return dfs(cnt,0,0,1);}int main(){ int n; while(~scanf("%d",&n)) { printf("%d\n",cal(n)); } return 0;}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117499.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 第一讲 数域_域 数学

    第一讲 数域_域 数学1.引入数是数学的一个最基本概念,回顾一下我们曾经学习过的数的发展过程:(1)代数性质:关于数的加,减,乘,除等运算的性质称为数的代数性质.(2)数集:数的集合简称数集.常见的数集:复试C;实数R;有理数Q等等.它们有一个共同的性质就是对加减乘除运算封闭.2.数域的定义设F是由一些复数组成的集合,其中包括0和1,如果F中任意两个数的和,差,积,商(除数不为0)扔是F中的数,则称F为一个数域.从数域的定义可以看出一个数域要满足:为复数的子集;包含0

    2022年10月23日
    0
  • Redis中缓存雪崩、缓存穿透等问题的解决方案「建议收藏」

    Redis中缓存雪崩、缓存穿透等问题的解决方案

    2022年2月14日
    43
  • C语言数组当参数传递

    C语言数组当参数传递在学习C语言的过程中遇到数组作为参数传递的问题一维数组:#includeinttest2(inta[]){ for(inti=0;i<5;i++){ printf("%d",a[i]); }}intmain(){ inta[5]={1,2,3,4,5},*p; p=a; test2(a); }这样我们可以很顺利的在test去遍历这个

    2022年7月11日
    17
  • 将ipad作为电脑拓展屏或分屏的简单方法[通俗易懂]

    将ipad作为电脑拓展屏或分屏的简单方法[通俗易懂]用Ipad实现电脑分屏的方法是挺简单的,但鉴于部分小白找不到合适的门路,在此重新分享一下。需要的装备:ipad电脑数据连接线方法:某宝上搜索 duetdisplay,只需1元左

    2022年8月5日
    4
  • MOS管开关电路_mos管作为开关的原理

    MOS管开关电路_mos管作为开关的原理MOS管开关电路是利用MOS管栅极(g)控制MOS管源极(s)和漏极(d)通断的原理构造的电路。因MOS管分为N沟道与P沟道,所以开关电路也主要分为两种。一般情况下普遍用于高端驱动的MOS,导通时需要是栅极电压大于源极电压。而高端驱动的MOS管导通时源极电压与漏极电压(VCC)相同,所以这时栅极电压要比VCC大4V或10V.如果在同一个系统里,要得到比VCC大的电压,就要专门的升压电路了。很多马达…

    2022年9月20日
    1
  • spring aop的五大通知类

    spring aop的五大通知类spring aop的五大通知类

    2022年4月22日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号