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>
    


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

  • 相关阅读:
    单链表反转的2种常见方法
    LeetCode解题报告:Reorder List
    LeetCode解题报告:Binary Tree Postorder Traversal
    LeetCode解题报告:LRU Cache
    LeetCode解题报告:Insertion Sort List
    Java编程杂记
    如何对一个不断更新的HashMap进行排序
    Python快速入门
    Html与CSS快速入门01-基础概念
    JVM快速入门
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4829115.html
Copyright © 2011-2022 走看看