HDU——B-number(数位DP)

来源:互联网 发布:财物软件属于erp吗 编辑:程序博客网 时间:2024/04/28 23:02

题目大意:

要找出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 10000typedef 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\n",cal(n));    }    return 0;}</strong></span>


0 0
原创粉丝点击