前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hdu 3652 B-number(数字dp)

hdu 3652 B-number(数字dp)

作者头像
全栈程序员站长
发布2022-07-06 08:49:38
1600
发布2022-07-06 08:49:38
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君。

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

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

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

然后进行记忆话搜索。

代码语言:javascript
复制
#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.cn/117499.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年1月4,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档