zoukankan      html  css  js  c++  java
  • HDU 3562 数位DP

    /***
    hdu 3652  数位dp(含13且被能被13整除的数)
    题目大意:求出给定区间内的数字含有“13”并且能被13整除的个数
    解题思路:记忆化搜索。
               dp[i][j][k][z]:i:处理的数位,j:该数对13取模以后的值,k:是否已经包含13,z结尾的数
    */

    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    using namespace std ;
    
    #define ll long long
    
    int dig[12];
    /***
    hdu 3652  数位dp(含13且被能被13整除的数)
    题目大意:求出给定区间内的数字含有“13”并且能被13整除的个数
    解题思路:记忆化搜索。
               dp[i][j][k][z]:i:处理的数位,j:该数对13取模以后的值,k:是否已经包含13,z结尾的数
    */
    int dp[12][13][2][10];
    
    int deal(int n)
    {
        int cnt=0;
        while(n>0)
        {
            dig[cnt++]=n%10;
            n=n/10;
        }
        return cnt;
    }
    int  dfs(int len,int mod,int t,int now,int e)
    {
        if(len<0)
            return (mod==0)&&t;
        if(!e&&dp[len][mod][t][now]!=-1)
            return dp[len][mod][t][now];
        int u=e?dig[len]:9;
        int ans=0;
        for(int i=0;i<=u;i++)
        {
            ans+=dfs(len-1,(mod*10+i)%13,t||(now==1&&i==3),i,e&&(i==u));
        }
        if(!e)
            dp[len][mod][t][now]=ans;
        return ans;
    }
    int calc(int n)
    {
        int len=deal(n);
        return dfs(len-1,0,0,0,1);
    }
    
    int main()
    {
        memset(dp,-1,sizeof(dp));
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            printf("%d
    ",calc(n));
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    同类分布[AHOI2009]
    简单记录一下ruby 循环
    ruby中的respond to ?用法
    ruby中的return方法及class实例方法的initialize方法
    ruby中的字符串分隔符--split
    三次握手+四次挥手
    DNS服务器的简介——2
    HTTP-报文结构解析
    ruby中的三目操作符和include?操作
    ruby中的extend 和 include
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6858087.html
Copyright © 2011-2022 走看看