hdu3652数位dp四 (数是13的倍数且包含13)

相比第一个数位dp,多加了一维mod,来判定前面值对13的取模,知道最后返回结果要两个都成立。

 1 #include<stdio.h>
 2 #include<string.h>
 3 int num[15];
 4 int dp[15][15][15][2];
 5 int dfs(int pos,int pre,int mod,int have,int limit)
 6 {
 7     if (pos==0) return have&&!mod;
 8     if (!limit&&dp[pos][pre][mod][have]!=-1)
 9         return dp[pos][pre][mod][have];
10     int tmp,i,ans=0;
11     tmp=limit?num[pos]:9;
12     for (i=0;i<=tmp;i++)
13         ans+=dfs(pos-1,i,(mod*10+i)%13,have||(pre==1&&i==3),limit&&(i==tmp));
14     if (!limit)
15         dp[pos][pre][mod][have]=ans;
16     return ans;
17 }
18 int main()
19 {
20     int n,cnt;
21     memset(dp,-1,sizeof(dp));
22     while (~scanf("%d",&n))
23     {
24         cnt=0;
25         while (n!=0)
26         {
27             num[++cnt]=n%10;
28             n/=10;
29         }
30         printf("%d\n",dfs(cnt,0,0,0,1));
31     }
32 }
View Code

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3652

posted on 2014-11-28 01:44  xiao_xin  阅读(225)  评论(0编辑  收藏  举报

导航