http://acm.hdu.edu.cn/showproblem.php?pid=3709
2 0 9 7604 24324
10 897
/**
hdu 3709 数位dp(自身平衡的数字)
题目大意:求给定区间内满足自身平衡的数的个数,所谓平衡,
比如:4139 is a balanced number with pivot fixed at 3. The torqueses are 4*2 + 1*1 = 9 and 9*1 = 9, for left part and right part, respectively.
解题思路:枚举支点。dp[i][j][k] i表示处理到的数位,j是支点,k是力矩和。但是要要把全是0的数排除
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
LL dp[20][20][2000];
int bit[25];
LL dfs(int pos,int level,int presum,int flag)
{
if(pos==-1)return presum==0;
if(presum<0)return 0;
if(!flag&&dp[pos][level][presum]!=-1)
return dp[pos][level][presum];
int end=flag?bit[pos]:9;
LL ans=0;
for(int i=0; i<=end; i++)
{
ans+=dfs(pos-1,level,presum+(pos-level)*i,flag&&(i==end));
}
if(!flag)dp[pos][level][presum]=ans;
return ans;
}
LL solve(LL n)
{
int len=0;
while(n)
{
bit[len++]=n%10;
n/=10;
}
LL ans=0;
for(int i=0; i<len; i++)
{
ans+=dfs(len-1,i,0,1);
}
return ans-(len-1);///去掉全部为0的情况
}
int main()
{
int T;
LL l,r;
memset(dp,-1,sizeof(dp));
scanf("%d",&T);
while(T--)
{
scanf("%I64d%I64d",&l,&r);
printf("%I64d\n",solve(r)-solve(l-1));
}
return 0;
}
原文:http://blog.csdn.net/lvshubao1314/article/details/43910299