HDU 3562 数位DP
/***
hdu 3652 数位dp(含13且被能被13整除的数)
题目大意:求出给定区间内的数字含有“13”并且能被13整除的个数
解题思路:记忆化搜索。
dp[i][j][k][z]:i:处理的数位,j:该数对13取模以后的值,k:是否已经包含13,z结尾的数
*/
#include <iostream> #include<string.h> #include<stdio.h> using namespace std ; #define ll long long int dig[12]; /*** hdu 3652 数位dp(含13且被能被13整除的数) 题目大意:求出给定区间内的数字含有“13”并且能被13整除的个数 解题思路:记忆化搜索。 dp[i][j][k][z]:i:处理的数位,j:该数对13取模以后的值,k:是否已经包含13,z结尾的数 */ int dp[12][13][2][10]; int deal(int n) { int cnt=0; while(n>0) { dig[cnt++]=n%10; n=n/10; } return cnt; } int dfs(int len,int mod,int t,int now,int e) { if(len<0) return (mod==0)&&t; if(!e&&dp[len][mod][t][now]!=-1) return dp[len][mod][t][now]; int u=e?dig[len]:9; int ans=0; for(int i=0;i<=u;i++) { ans+=dfs(len-1,(mod*10+i)%13,t||(now==1&&i==3),i,e&&(i==u)); } if(!e) dp[len][mod][t][now]=ans; return ans; } int calc(int n) { int len=deal(n); return dfs(len-1,0,0,0,1); } int main() { memset(dp,-1,sizeof(dp)); int n; while(scanf("%d",&n)!=EOF) { printf("%d\n",calc(n)); } return 0; }
posted on 2017-05-15 19:50 HelloWorld!--By-MJY 阅读(204) 评论(0) 编辑 收藏 举报