zoukankan      html  css  js  c++  java
  • 【HDOJ 3652】B-number

    【HDOJ 3652】B-number

    给一整数n 找<=n的整数中能被13整除且含有13的 数位dp 记忆化!


    一入记忆化深似海。

    。。再也不想用递推了。。。发现真的非常好想 仅仅要保证满足条件把未选高位(即能任意挑数的)记录下来 不断搜索递归即可

    代码例如以下:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    
    using namespace std;
    
    int dp[10][13][3];
    int digit[10];
    
    /*
    hs = 
    0 无13
    1 无13 前位为1
    2 出现13
    mod表示高位取余后的结果 遍历完后mod == 0说名能被13整除 按位取余
    */
    
    int dfs(int pos,int mod,int hs,bool high)
    {
        if(pos == -1) return hs == 2 && !mod;
        if(!high && ~dp[pos][mod][hs]) return dp[pos][mod][hs];
    
        int i,en,ans = 0,nhs,nmd;
        en = high? digit[pos]: 9;
    
        for(i = 0; i <= en; ++i)
        {
            nmd = (mod*10+i)%13;
            nhs = hs;
            if(nhs == 1 && i == 3) nhs = 2;
            else if(nhs != 2) nhs = (i == 1)? 1: 0;
            ans += dfs(pos-1,nmd,nhs,high && i == en);
        }
    
        if(!high) dp[pos][mod][hs] = ans;
        return ans;
    }
    
    int Solve(int x)
    {
        int len = 0;
        while(x)
        {
            digit[len++] = x%10;
            x /= 10;
        }
        return dfs(len-1,0,0,1);
    }
    
    int main()
    {
        memset(dp,-1,sizeof(dp));
        int n;
        while(~scanf("%d",&n)) printf("%d
    ",Solve(n));
        return 0;
    }
    
  • 相关阅读:
    4/19学习总结
    人月神话读后感8
    4/18学习总结:PullToRefresh
    构建之法阅读笔记03
    构建之法阅读笔记02
    个人总结
    大二下学期课程总结
    学习进度16
    学习进度15
    课堂测试-找英语单词最长链
  • 原文地址:https://www.cnblogs.com/wzjhoutai/p/7159813.html
Copyright © 2011-2022 走看看