zoukankan      html  css  js  c++  java
  • HDU——B-number(数字DP)

    标题效果:

    要了解1至n如何号码之间有许多含有13,并13可分

    记忆化搜索:

    dp[pos][pre][mod][statu],pos位数,pre前一位,mod余数,statu状态

    有2个状态:含13,不含13


    <span style="font-size:18px;"><strong>#include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<vector>
    #include<queue>
    #include<deque>
    #include<stack>
    #include<map>
    #include<set>
    #include<cmath>
    #include<cstdlib>
    #include<cctype>
    #define inf 0x3f3f3f3f
    #define maxn 10000
    typedef long long LL;
    using namespace std;
    int dp[15][15][15][2];
    int n,pos,num[11];
    int dfs(int pos,int s,int pre,int z,int e)
    {
        if(pos==-1) return s==1&&!z; //含13而且能被13整除
        if(!e&&dp[pos][pre][z][s]!=-1) return dp[pos][pre][z][s];
        int end=e?num[pos]:9;
        int sum=0;
        for(int i=0;i<=end;i++){
            int mod=(z*10+i)%13;
            if(pre==1&&i==3) sum+=dfs(pos-1,1,i,mod,e&&i==end);
            else sum+=dfs(pos-1,s,i,mod,e&&i==end);
        }
        return e?sum:dp[pos][pre][z][s]=sum;
    }
    
    
    void Init(int x)
    {
        pos=0;
        while(x){
            num[pos++]=x%10;
            x/=10;
        }
        memset(dp,-1,sizeof dp);
    }
    int cal(int x)
    {
        Init(x);
        return dfs(pos-1,0,0,0,1);
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF){
            printf("%d
    ",cal(n));
        }
        return 0;
    }</strong></span>
    


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    使用QQ邮箱发送邮件,QQ邮箱的smtp设置
    Linux常用命令
    Pycharm批量查找替换功能
    HTML/CSS学习笔记
    什么样的人适合做自动化测试
    如何测试一个WEB的输入框?
    我收集的学习网站
    SQL查询练习(一)
    linux消息队列应用编程
    linux共享内存简单介绍以及编码演示
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4829115.html
Copyright © 2011-2022 走看看