hdu3652(数位dp)

链接:点击打开链接

题意:问1~n中包含序列"13"且能被13整除的数有多少个

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
const int siz=50;
long long a[siz],dp[siz][15][15][2];
int dfs(int pos,int pre,int sta,int mod,int lim){
    int i,u;
    long long ans=0;
    if(pos==0){
        if(sta==1&&mod==0)
        return 1;
        return 0;
    }
    if(dp[pos][pre][mod][sta]!=-1&&lim==0)
    return dp[pos][pre][mod][sta];
    u=lim?a[pos]:9;
    for(i=0;i<=u;i++){                          //记录一下是否含有13,如果有
        if(pre==1&&i==3)                        //直接将sta置1,否则保持原有值
        ans+=dfs(pos-1,i,1,(mod*10+i)%13,lim&(i==u));
        else                                    //同事记录余数
        ans+=dfs(pos-1,i,sta,(mod*10+i)%13,lim&(i==u));
    }
    if(lim==0)
    dp[pos][pre][mod][sta]=ans;
    return ans;
}
long long cal(long long x){
    int pos=0;
    while(x){
        a[++pos]=x%10;
        x/=10;
    }
    return dfs(pos,0,0,0,1);
}
int main(){
    long long r;
    memset(dp,-1,sizeof(dp));
    while(scanf("%I64d",&r)!=EOF){
        printf("%I64d\n",cal(r));
    }
    return 0;
}
/*
13
100
200
1000
*/

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