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;
    }
  • 相关阅读:
    匿名内部类详解
    成员内部类详解
    内部类
    局部内部类详解
    switch
    Enum 类型
    循环
    标号
    软件开发模型
    RUP
  • 原文地址:https://www.cnblogs.com/acmsong/p/7267361.html
Copyright © 2011-2022 走看看