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 }