博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3652 B-number (数位DP,入门)
阅读量:5012 次
发布时间:2019-06-12

本文共 1379 字,大约阅读时间需要 4 分钟。

 

 

题意:

  如果一个整数能被13整除,且其含有子串13的,称为"B数",问[1,n]中有多少个B数?

 

 

思路:

  这题不要用那个DFS的模板估计很快秒了。

  状态设计为dp[位数][前缀][模13][是否含13],前缀这一维还是有必要的(由于只有前缀1和其他不同,所以也可以用01来表示是否前缀为1)。递归出口是:出现"13"且mod=0。

 

 

 

 

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #define pii pair
11 #define INF 0x7f3f3f3f12 #define LL long long13 #define ULL unsigned long long14 using namespace std;15 const double PI = acos(-1.0);16 const int N=11;17 18 int f[N][N][13][2], bit[N]; 19 //[位数][前缀][模13的余数][是否包含13]20 21 int dfs(int i,int pre,int mod,bool B,bool e)22 {23 if(i==0) return !mod&&B;24 if(!e && ~f[i][pre][mod][B]) return f[i][pre][mod][B];25 26 int ans=0, m=0;27 int u= e? bit[i]: 9;28 for(int d=0; d<=u; d++)29 {30 m=(mod*10+d)%13;31 if( pre==1&&d==3 )32 ans+=dfs(i-1, d, m, true, e&&d==u);33 else34 ans+=dfs(i-1, d, m, B, e&&d==u);35 }36 return e? ans: f[i][pre][mod][B]=ans;37 }38 39 int cal(int n)40 {41 int len=0;42 while(n) //拆数43 {44 bit[++len]=n%10;45 n/=10;46 }47 return dfs(len, 0, 0, false, true);48 }49 50 int main()51 {52 //freopen("input.txt","r",stdin);53 memset(f,-1,sizeof(f));54 int n;55 while( ~scanf("%d",&n) )56 printf("%d\n",cal(n) );57 58 return 0;59 }
AC代码

 

转载于:https://www.cnblogs.com/xcw0754/p/4854655.html

你可能感兴趣的文章
关于<form> autocomplete 属性
查看>>
OutOfMemory
查看>>
LeetCode:组合总数III【216】
查看>>
Thinkphp框架回顾(三)之怎么实现平常的sql操作数据库
查看>>
虚函数的效率问题
查看>>
POJ 1860 Currency Exchange(SPFA 判断有无“正”环)
查看>>
广告地址屏蔽
查看>>
收缩SqlServer数据库日记方法
查看>>
每日英语:15 places to find inspiration
查看>>
学习方法--提问
查看>>
【转】每天一个linux命令(3):pwd命令
查看>>
merge-two-sorted-lists
查看>>
MySQL(3)
查看>>
poj1061——扩展gcd水题
查看>>
UVa400.Unix ls
查看>>
POJ 2299 Ultra-QuickSort 归并排序、二叉排序树,求逆序数
查看>>
Educational Codeforces Round 60 (Rated for Div. 2) C. Magic Ship
查看>>
Windows 2008 R2系统开机时如何不让Windows进行磁盘检测?
查看>>
WP7应用开发笔记(18) 本地化与多语言
查看>>
解决 .so文件64与32不兼容问题
查看>>