hdu3709 数位dp六(左权重等于右权重的数)

和五类似,此题枚举的是平衡位置,然后依旧数位dp只要从头dfs到尾权重为0即符合。

注意0每一次都被重复计算了。

 1 #include<stdio.h>
 2 #include<string.h>
 3 long long dp[20][1800][20];
 4 int num[20];
 5 long long dfs(int pos,int sum,int tmp,int limit)
 6 {
 7     if (pos==0) return sum==0;
 8     if (sum<0) return 0;
 9     if (!limit&&dp[pos][sum][tmp]!=-1)
10         return dp[pos][sum][tmp];
11     int temp=limit?num[pos]:9,i;
12     long long ans=0;
13     for (i=0;i<=temp;i++)
14         ans+=dfs(pos-1,sum+i*(pos-tmp),tmp,limit&&i==temp);
15     if (!limit)
16         dp[pos][sum][tmp]=ans;
17     return ans;
18 }
19 long long cal(long long x)
20 {
21     if (x<0) return 0;
22     long long ans=0;
23     int cnt=0;
24     while (x!=0){
25         num[++cnt]=x%10;
26         x/=10;
27     }
28     for (int i=cnt;i>=1;i--)
29         ans+=dfs(cnt,0,i,1);
30     return ans-cnt+1;
31 }
32 int main()
33 {
34     int T;
35     long long x,y;
36     memset(dp,-1,sizeof(dp));
37     scanf("%d",&T);
38     while (T--)
39     {
40         scanf("%I64d%I64d",&x,&y);
41         printf("%I64d\n",cal(y)-cal(x-1));
42     }
43 }
View Code

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709

posted on 2014-11-28 22:51  xiao_xin  阅读(169)  评论(0编辑  收藏  举报

导航