您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: