码迷,mamicode.com
首页 > 其他好文 > 详细

hdu3652 数位dp记忆化搜索

时间:2019-04-11 11:58:35      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:记忆化   c++   return   efi   while   pos   出现   end   eof   

从未见过的船新版本数位dp,,省去了预处理过程,直接进行计算

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int dp[20][20][5],n,len,bit[20];
//dp[i][j][k]:到i位数,前面模13=j,前面是1|不是1|有13的状态已经确定,后面的数的个数 
//mod:前面%13的余数,flag=0|1|2:pos+1位不是1|是1|有13出现过了,lim:数的限制 
int dfs(int pos,int mod,int flag,int lim){
    if(!lim && dp[pos][mod][flag]!=-1)//只有在无限制的情况下才能直接返回 
        return dp[pos][mod][flag];
    if(pos<=0)return mod==0&&flag==2; 
    int num,mod_x,flag_x,res=0;
    if(lim)num=bit[pos];else num=9;
    for(int i=0;i<=num;i++){
        mod_x=(mod*10+i)%13;
        flag_x=flag;
        if(flag==0 && i==1)flag_x=1;
        if(flag==1 && i!=1)flag_x=0;
        if(flag==1 && i==3)flag_x=2;
        res+=dfs(pos-1,mod_x,flag_x,lim&&i==num);
    }
    if(!lim)dp[pos][mod][flag]=res;
    return res;
}

int main(){
    while(cin>>n){
        memset(bit,0,sizeof bit);
        memset(dp,-1,sizeof dp);
        len=0;
        while(n){bit[++len]=n%10;n/=10;}
        cout<<dfs(len,0,0,1)<<endl;
    }
}

 

hdu3652 数位dp记忆化搜索

标签:记忆化   c++   return   efi   while   pos   出现   end   eof   

原文地址:https://www.cnblogs.com/zsben991126/p/10688699.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!