码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 3652

时间:2015-02-02 10:46:45      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

观察区数字是否含有13并且能被13整除

基础的数位dp到此大概就结束了,接下来会练习一些网络赛和区域赛的数位dp进一步巩固

Sample Input

13
100
200
1000

Sample Output
1
1
2
2

注意在判断新状态的时候顺序不能弄反,否则会把之前的正确状态覆盖

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 //printf("----\n");
 8 using namespace std;
 9 int n,m,t;
10 int dp[15][3][15];
11 int digit[15];
12 int dfs(int p,int s,int mod,bool e) {       //s记录上一位,mod记录余数
13     printf("%d\n",mod);
14     if (p==-1) return s==2&&mod==0;
15     if (!e &&dp[p][s][mod]!=-1) return dp[p][s][mod];
16     int res = 0;
17     int u = e?digit[p]:9;
18     for (int i=0;i<=u;++i)
19     {
20         //printf("%d %d %d\n",p,s,i);
21         int ns=s;
22         if(s==1&&i!=1)  ns=0;
23         if(s==0&&i==1)  ns=1;
24         if(s==1&&i==3)  ns=2;
25         res+=dfs(p-1,ns,(mod*10+i)%13,e&&i==u); //看是否能整除13,而且由于是从原来数字最高位开始算,事实上这个过程就是一个除法过程
26     }
27     return e?res:dp[p][s][mod]=res;
28 }
29 int solve(int n)
30 {
31     int len=0;
32     while(n)
33     {
34         digit[len++]=n%10;
35         n/=10;
36     }
37     return dfs(len-1,0,0,1);
38 }
39 int main()
40 {
41     int i,j,k;
42     //freopen("1.in","r",stdin);
43     memset(dp,-1,sizeof(dp));
44     while(scanf("%d",&n)!=EOF)
45     {
46         printf("%d\n",solve(n));
47     }
48 }

 

hdu 3652

标签:

原文地址:http://www.cnblogs.com/cnblogs321114287/p/4267088.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!