zoukankan      html  css  js  c++  java
  • [hdu 3652]数位dp解决数的倍数问题

    原以为很好的理解了数位dp,结果遇到一个新的问题还是不会分析,真的是要多积累啊。

    解决13的倍数,可以根据当前余数来推,所以把当前余数记为一个状态就可以了。

    #include<bits/stdc++.h>
    using namespace std;
    
    int dp[20][13][2][10];
    int b[20];
    
    int dfs(int pos,int preok,int rem,int th,int pre)
    {
        if (pos==-1)
        {
            if (rem==0&&th==1) return 1;
            else return 0;
        }
        if (preok&&dp[pos][rem][th][pre]!=-1) return dp[pos][rem][th][pre];
        int up=preok?9:b[pos];
        int ans=0;
        for (int i=0;i<=up;i++)
        {
            ans+=dfs(pos-1,i<b[pos]||preok,(rem*10+i)%13,pre==1&&i==3||th,i);
        }
        if (preok) dp[pos][rem][th][pre]=ans;
        return ans;
    }
    
    int solve(int n)
    {
        int cnt=0;
        do {
            b[cnt++]=n%10;
            n/=10;
        }while (n);
        return dfs(cnt-1,0,0,0,0);
    }
    
    int main()
    {
        memset(dp,-1,sizeof(dp));
        int n;
        while (~scanf("%d",&n))
        {
            printf("%d
    ",solve(n));
        }
        return 0;
    }
  • 相关阅读:
    IBM小练习
    面向对象
    面向对象_人狗大战
    面向对象组合小练习
    面向对象小作业
    作业大礼包_员工信息表
    异常报错处理
    开发规范

    U-boot工作流程分析
  • 原文地址:https://www.cnblogs.com/acmsong/p/7267361.html
Copyright © 2011-2022 走看看