HDU 2089 不要62 (数位Dp)

Posted bakacirno

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 2089 不要62 (数位Dp)相关的知识,希望对你有一定的参考价值。

传送门
数位(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
",solve(high)-solve(low-1)); //求区间中的数固定方法 
    }
    return 0; 
}

以上是关于HDU 2089 不要62 (数位Dp)的主要内容,如果未能解决你的问题,请参考以下文章

HDU2089 ------不要62(数位dp)

HDU 2089 不要62(数位DP)

hdu 2089 不要62数位dp

HDU 2089 不要62(数位dp入门)

HDU2089 不要62[数位DP]

hdu2089不要62(数位dp)