感觉挺不错的一道数位DP。通过这题感觉对数位DP又多了一层理解。用了四维DP数组.dp[cnt][pre][mods][in],cnt表示第几位。pre表示前面的数。mods表示目前的模,in表示目前是否包含13这个数字.然后进行dfs搜索就可以了。
代码如下:
#include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #include <stdio.h> using namespace std; #define LL int #define pi acos(-1.0) const int mod=100000000; const int INF=0x3f3f3f3f; const double eqs=1e-8; int dp[20][20][20][3], c[20]; int dfs(int cnt, int pre, int mods, int maxd, int zero, int in) { if(cnt==-1) return !mods&∈ if(maxd&&zero&&dp[cnt][pre][mods][in]!=-1) return dp[cnt][pre][mods][in]; int i, r=maxd?9:c[cnt], ans=0; for(i=0;i<=r;i++){ ans+=dfs(cnt-1,i,(mods*10+i)%13,maxd||i<r,zero||i,in||(pre==1&&i==3)); } if(maxd&&zero) dp[cnt][pre][mods][in]=ans; return ans; } int Cal(int x) { int i, cnt=0; while(x){ c[cnt++]=x%10; x/=10; } return dfs(cnt-1,0,0,0,0,0); } int main() { int n; memset(dp,-1,sizeof(dp)); while(scanf("%d",&n)!=EOF){ printf("%d\n",Cal(n)); } return 0; }
原文地址:http://blog.csdn.net/scf0920/article/details/42874531