UESTC 832

数位DP

DFS

#include <iostream>
#include<string.h>
#include<stdio.h>
using namespace std ;
#define LL long long
LL dp[22][11];
int dig[22];

LL dfs(int len,int cnt,int e)  长度  前几个数字 和%10   是否可以随便填  1 不可以   0  可以 
{
    if(len==0)
        return cnt==0;
    if(!e&&dp[len][cnt]!=-1)
        return dp[len][cnt];
    LL ans=0;
    int mmax = e ? dig[len] : 9;
    for(int i=0;i<=mmax;i++)
    {
        ans+=dfs(len-1,(cnt+i)%10,e&&(i==mmax));
    }
    if(!e)
        dp[len][cnt]=ans;
    return ans;
}

LL Ques(LL n)
{
    if(n==-1)
        return 0;
    int len=0;
    memset(dig,0,sizeof(dig));
    while(n)
    {
        dig[++len]=n%10;
        n/=10;
    }
    return dfs(len,0,1);
}

int main()
{
    int t,ca=1;
    scanf("%d",&t);
    memset(dp,-1,sizeof(dp));
    while(t--)
    {
        LL n,m;
        scanf("%lld%lld",&n,&m);
        printf("Case #%d: %lld
",ca++,Ques(m)-Ques(n-1));
    }
    return 0 ;
}
原文地址:https://www.cnblogs.com/cherryMJY/p/6477269.html