HDU5787 K-wolf Number(数位DP)
2016-08-02 18:45
453 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=5787
题意:
计算区间内满足:相邻k个数位不重复的数的个数。思路:
明显的数位DP,注意储存时存后缀4位就行了。代码:
//kopyh #include <bits/stdc++.h> #define N 19 using namespace std; int n,m,sum,res,flag; long long dp [10000][2][2],dig ; long long dfs(int len, int mod, int k, int mark, int flag) { if(len<=0)return k==0; if(!flag && dp[len][mod][k][mark]!=-1)return dp[len][mod][k][mark]; int num = flag?dig[len]:9; long long ans=0; for(int i=0;i<=num;i++) { long long modt = mod%m*10+i; int kt=k, t=m; if(!mark)while(t){if(mod/t%10!=0)break;t/=10;} while(t){if(mod/t%10==i)kt=1;t/=10;} ans+=dfs(len-1,modt,kt,mark||mod/m>0,flag&&num==i); } if(!flag)dp[len][mod][k][mark] = ans; return ans; } long long solve(long long x) { int len=0; while(x)dig[++len]=x%10,x/=10; n=len; return dfs(len,0,0,0,1); } void init() { memset(dp,-1,sizeof(dp)); int t=1; while(m--)t*=10; m=t/100; } int main() { int i,j,k,cas,T,t; long long x,y,z; while(scanf("%I64d%I64d%d",&x,&y,&m)!=EOF) { init(); printf("%I64d\n",solve(y)-solve(x-1)); } return 0; }
相关文章推荐
- hdu5791Two dp hdu5781ATM Mechine 概率dp hdu5787 K-wolf Number 数位dp
- hdu5787 K-wolf Number【数位dp】
- [暑假集训--数位dp]hdu5787 K-wolf Number
- HDU 5787 K-wolf Number(数位DP)
- hdu_5787_K-wolf Number(数位DP)
- hdu5787 数位DP
- HDOJ 5787 K-wolf Number 数位DP
- HDU 5787 K-wolf Number 数位dp
- HDU - 5787 K-wolf Number 数位DP
- hdu5787 数位dp 数位压缩
- Hdu-5787 K-wolf Number(数位DP)
- hdu 5787 K-wolf Number 数位dp
- 【HDU 5787】K-wolf Number(数位DP)
- hdu5787(数位dp)
- hdu5787 数位dp
- hdu 5787 K-wolf Number (数位DP )
- hdu 5787 K-wolf Number(数位dp)
- HDU 5787 K-wolf Number 数位dp
- [2016ACM多校] HDU5787 数位DP
- HDU 5787 K-wolf Number (数位DP)