首页 > 其他 > 详细

hdu3709 数位dp

时间:2019-04-17 23:28:27      阅读:145      评论:0      收藏:0      [点我收藏+]

枚举fix所在的位置loc即可,然后数位dp即可

这题要注意一种特殊情况,就是所有位都是0的时候对于每个fix都是成立的

/*
dp[i][j][k]表示前i位确定了平衡点在第j位,前i位和为k
fix需要在开始dfs前就预先确定下来 
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[20][20][1800],a[20];
ll dfs(ll pos,ll fix,ll sum,ll lim){
    if(pos==0)return sum==0?1:0;
    if(sum<0)return 0;
    if(!lim && dp[pos][fix][sum]!=-1)
        return dp[pos][fix][sum]; 
    int num=lim?a[pos]:9;
    ll res=0;
    for(int i=0;i<=num;i++)
        res+=dfs(pos-1,fix,sum+i*(pos-fix),lim&&i==num);;
    if(!lim)dp[pos][fix][sum]=res;
    return res;
}
ll calc(ll x){
    if(x==-1)return 0;
    ll len=0,res=0;
    while(x){
        a[++len]=x%10;
        x/=10;
    }
    for(int i=len;i>=1;i--)
        res+=dfs(len,i,0,1);
    return res-len+1;
}
int main(){
    memset(dp,-1,sizeof dp);    
    int t;
    cin>>t;
    while(t--){
        ll A,B;
        cin>>A>>B;
        cout<<calc(B)-calc(A-1)<<endl;
    }
} 

 

hdu3709 数位dp

原文:https://www.cnblogs.com/zsben991126/p/10726937.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!