HDU 3652 B-number DP入门

来源:互联网 发布:g76数控车床车蜗杆编程 编辑:程序博客网 时间:2024/06/07 22:59

也是入门题,相比不要62那题, 只需要多开一维have,初始化维0,存储每次选择数字后对13取余;

prev中存储每次前一位是否为1;

#include <cstdio>#include <string>#include <cstring>#include <iostream>#include <algorithm>#include <vector>#define maxn 30using namespace std;#define ll long longint limit[40],dp[40][10][20];int dfs(int now,int prev,int have,bool flag){    if(now<=0) return prev==2&&have==0;    if(!flag&&dp[now][prev][have]!=-1) return dp[now][prev][have];    int bound=flag?limit[now]:9,ret=0;    for(int k=0;k<=bound;k++)    {        int prev_x,have_x;        prev_x=prev;        have_x=(have*10+k)%13;        if(prev==0&&k==1) prev_x=1;        if(prev==1&&k!=1) prev_x=0;        if(prev==1&&k==3) prev_x=2;        ret+=dfs(now-1,prev_x,have_x,flag&&(k==bound));    }    if(!flag) dp[now][prev][have]=ret;    return ret;}int count(int x){    int len=0;    while(x)    {        limit[++len]=x%10;        x/=10;    }    return dfs(len,0,0,true);}int main(){    int n;    memset(dp,-1,sizeof(dp));    while(cin>>n)    {        cout<<count(n)<<endl;    }    return 0;}


0 0
原创粉丝点击