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 }