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

HDU 2089 不要62 (数位Dp)

时间:2019-11-09 09:35:42      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:print   ring   href   注意   using   hdu   pid   细节   main   

传送门
数位\(Dp\)模板题,也是我的第一道数位\(Dp\)题。
感觉数位\(Dp\)虽然细节比较多,但是确非常套路
而且考的题都比较裸,所以根据题意直接套模板就行

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
int low,high;
int f[20][20],a[20];

int dfs(int pos,int pre,int limit){
    //注意如果当前搜索状态是被限制的话(limit==1)
    //说明当前处于特殊情况,不能 
    if(pos==-1) return 1; //如果pos到达了-1位说明找到一种情况 
    if(!limit && f[pos][pre]!=-1) return f[pos][pre];
    //注意limit如果为真时不可直接使用记忆化数组中的值 
    int up=limit ? a[pos]:9; //本位枚举的上界 
    int temp=0;
    for(int i=0;i<=up;i++){
        if(i==4 || i==2&&pre==6) continue; //由题意可知 
        temp+=dfs(pos-1,i,limit && i==a[pos]); //注意limit的变化方法 
    }
    if(!limit) f[pos][pre]=temp; //要不要更新数组同样取决于limit 
    return temp;
}

int solve(int x){
    int pos;
    for(pos=0;x;pos++,x/=10) 
        a[pos]=x%10;
    //将要求的数拆分出来,可以是任意进制的数,这里是10进制 
    return dfs(pos-1,0,1);
}

int main(){
    while(~scanf("%d%d",&low,&high)&&low+high){
        memset(f,-1,sizeof(f));
        printf("%d\n",solve(high)-solve(low-1)); //求区间中的数固定方法 
    }
    return 0; 
}

HDU 2089 不要62 (数位Dp)

标签:print   ring   href   注意   using   hdu   pid   细节   main   

原文地址:https://www.cnblogs.com/BakaCirno/p/11824034.html

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