HDU:3652 B-number(数位DP)

数位dp。

问你能被13整除而且包含13的数字有多少个。

dp[i][j][k][vis]表示第i位以j开头模13余k,是否出现过13的,符合数目。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define ll long long
#define Maxn 20000
using namespace std;
int f[12][10][15][2];

int digit[12];
int dp(int pos,int num,int mod,bool vis,bool flag)
{
    if(pos==-1) return vis&&!mod;
    if(!flag&&f[pos][num][mod][vis]!=-1)
        return f[pos][num][mod][vis];
    int end=flag?digit[pos]:9;
    int ans=0;
    for(int i=0; i<=end; ++i)
        ans+=dp(pos-1,i,(mod*10+i)%13,vis||(num==1&&i==3),flag&&(i==end));
    if(!flag)
        f[pos][num][mod][vis]=ans;
    return ans;

}
int main()
{
    int n;
    memset(f,-1,sizeof(f));
    while(scanf("%d",&n)!=EOF)
    {
        int len=0;
        while(n)
        {
            digit[len++]=n%10;
            n/=10;
        }
        printf("%d\n",dp(len-1,0,0,0,1));
    }
    return 0;
}


你可能感兴趣的:(动态规划,数位dp)