hdu3709 Balanced Number(数位dp)

来源:互联网 发布:mac 版cad导入字体库 编辑:程序博客网 时间:2024/05/23 14:34

hdu3709

题目

有一种数字,以某一位为支点,把它看成杠杠,如果平衡的话就是平衡数,如4139,以3为支点4*2+1=9,现给定区间求平衡数的个数。

思路

记录支点pov以及当前力矩l,调用函数时枚举pov,算l时用(len-pov)*i,这样当l<0时就没必要算下去了,算是个剪枝,其他就是数位dp了。

代码

#include<iostream>#include<cstring>#include<cstdio>#include<vector>#include<queue>#include<algorithm>#include<stack>using namespace std;typedef  long long ll;ll dp[20][20][3000];int dis[20];ll dfs(int len,int pov,int l,int lim){    if(l<0) return 0;    if(len<0) return l==0?1:0;    if(!lim&&dp[len][pov][l]!=-1) return dp[len][pov][l];    ll res=0;    int u=lim?dis[len]:9;    for(int i=0;i<=u;i++)    {        res+=dfs(len-1,pov,l+(len-pov)*i,lim&&i==u);    }    if(lim) return res;    else return dp[len][pov][l]=res;}ll solve(ll x){    int len=0;    while(x)    {        dis[len++]=x%10;        x/=10;    }    ll ans=0;    for(int i=0;i<len;i++)        ans+=dfs(len-1,i,0,1);    return ans-(len);}ll a,b;int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%I64d %I64d",&a,&b);        memset(dp,-1,sizeof(dp));        printf("%I64d\n",solve(b)-solve(a-1));    }}
0 0
原创粉丝点击