zoukankan      html  css  js  c++  java
  • HDOJ 4389 X mod f(x) (数位DP)

    题意:求区间[A , B]中能被自身的数位和整除的数有多少个。1 <= A <= B <= 109

    分析:由于在DP的过程中不知道最后的数位和是多少,所以状态不好设计,但是考虑到数位和最大是81,所以可以用类似枚举数位和的思想来设计状态。

    View Code

    #include <stdio.h>
    #include <string.h>
    #define N 11
    int digit[N];
    int dp[N][82][82][82];
    int dfs(int pos,int sum,int mod,int m,int f)
    {
        if(pos==-1) return (sum==mod&&m==0) ? 1 : 0;
        if(!f&&dp[pos][sum][mod][m]!=-1)    return dp[pos][sum][mod][m];
        int ret=0;
        int max=f ? digit[pos] : 9;
        for(int i=0;i<=max;i++)
        {
            ret+=dfs(pos-1,sum+i,mod,(m*10+i)%mod,f&&i==max);
        }
        if(!f)  dp[pos][sum][mod][m]=ret;
        return ret;
    }
    int cal(int x)
    {
        int pos=0;
        while(x)
        {
            digit[pos++]=x%10;
            x/=10;
        }
        int ret=0;
        for(int i=1;i<=81;i++)
        {
            ret+=dfs(pos-1,0,i,0,1);
        }
        return ret;
    }
    int main()
    {
        int t,a,b,ca=0;
        memset(dp,-1,sizeof(dp));
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&a,&b);
            printf("Case %d: %d\n",++ca,cal(b)-cal(a-1));
        }
        return 0;
    }
  • 相关阅读:
    HTML
    汉企,新的起点
    表格标签
    常用标签
    HTML
    我的未来规划
    世界首富如何炼成? 看盖茨20条箴言
    获取Java项目根目录 N多方法(转载)
    进程间通信——管道
    necessitas
  • 原文地址:https://www.cnblogs.com/algorithms/p/2712351.html
Copyright © 2011-2022 走看看