首页 > 其他 > 详细

数位dp之B-number

时间:2020-07-28 21:39:49      阅读:50      评论:0      收藏:0      [点我收藏+]

HDU - 3652

这道题的大致意思就是给你一个数n,让你去统计[1,n]之间含有13同时能够被13整除的数的个数。

这是一道比较简单的数位dp的题。主要难点是如何去计算这个数是否能够被13整除,这里就用到mod。

上一个位置余数*10加上这个位子的数去%13,最后只要判断这个余数是否等于0就可以了。

具体代码如下:

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int a[20];
 7 int dp[20][20][3];
 8 /*
 9 dp[i][j][k] j表示余数
10 k==0不包含13且不以1结尾
11 k==1 不包含13且1结尾
12 k==2 包含13
13 */
14 int dfs(int pos,int mod,int sta,bool lim){
15     if(pos<=0)
16         return mod==0&&sta == 2;
17     if(!lim&&dp[pos][mod][sta]!=-1)
18         return dp[pos][mod][sta];
19     int up = lim ? a[pos] : 9;
20     int ans = 0;
21     for (int i = 0; i <= up;i++)
22     {
23         int mod1 = (mod * 10 + i) % 13;//计算余数
24         int sta1 = sta;
25         if(sta==1&&i==3)
26             sta1 = 2;
27         else if(sta==0&&i==1)
28             sta1 = 1;
29         else if(sta==1&&i!=1)
30             sta1 = 0;
31         ans += dfs(pos - 1, mod1,sta1, lim && i == up);
32     }
33     if(!lim){
34         dp[pos][mod][sta] = ans;
35     }
36     return ans;
37 }
38 int solve(int x){//计算数各个位置上的值
39     int pos = 0;
40     while(x){
41         a[++pos] = x % 10;
42         x /= 10;
43     }
44     return dfs(pos,0, 0, true);
45 }
46 int main(){
47     int r;
48     while(~scanf("%d",&r)){
49         memset(dp, -1, sizeof dp);
50         printf("%d\n", solve(r));
51     }
52 }

 

数位dp之B-number

原文:https://www.cnblogs.com/kitalekita/p/13392727.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!