标签:des style blog http java color
2 0 9 7604 24324
10 897
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define maxn 1005
#define MAXN 100005
#define mod 100000000
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
typedef long long ll;
using namespace std;
ll n,m,ans,tot,len;
ll dig[20],dp[20][20][2000]; // 当前位置 支点位置 前缀力矩和
ll dfs(ll pos,ll zd,ll sum,ll limit) // 当前位置 支点位置 前缀力矩和 对上届有无限制
{
if(sum<0) return 0;
if(pos==0)
{
if(sum==0) return 1;
return 0;
}
if(!limit&&dp[pos][zd][sum]!=-1) return dp[pos][zd][sum]; // 注意这里要对上届无限制
ll i,j,t,ed,best=0;
if(limit) ed=dig[pos];
else ed=9;
for(i=0;i<=ed;i++)
{
best+=dfs(pos-1,zd,sum+(pos-zd)*i,limit&&(i==ed)); // 由下一位的状态递推过来
}
if(!limit) dp[pos][zd][sum]=best; // 记忆化 注意这里要对上届无限制
return best;
}
ll solve(ll u)
{
if(u==-1) return 0;
if(u==0) return 1;
ll i,j,t,res=0;
len=0;
memset(dig,0,sizeof(dig));
while(u)
{
dig[++len]=u%10;
u/=10;
}
for(i=1;i<=len;i++) // 枚举支点所在的位置
{
res+=dfs(len,i,0,1);
}
return res-len+1; // 0算了len遍
}
int main()
{
ll i,j,t;
memset(dp,-1,sizeof(dp));
scanf("%I64d",&t);
while(t--)
{
ll u,v;
scanf("%I64d%I64d",&u,&v);
ans=solve(v)-solve(u-1);
printf("%I64d\n",ans);
}
return 0;
}
hdu 3709 Balanced Number (数位dp),布布扣,bubuko.com
hdu 3709 Balanced Number (数位dp)
标签:des style blog http java color
原文地址:http://blog.csdn.net/tobewhatyouwanttobe/article/details/37565447