之前写数位dp是用dp方程递推形式写,接触记忆化搜索版后,发现使用dfs更加清晰明了,思路很顺,代码简洁的多W。
首先上模板,以HDU 2089 不要62为例
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#include <algorithm>
#include <vector>
#include <stack>
#include <math.h>
#include <iostream>
#include <functional>
using namespace std;
#define pow(i) (1<<(i))
#define INF (1<<29)
#define mem(x) memset(x,0,sizeof(x))
#define mem1(x) memset(x,-1,sizeof(x))
typedef long long LL;
int dp[10][2];
int digit[20];
int dfs(int pos,bool state,bool fp)//pos为当前位数,state为当前状态[1],fp为上一位是否到达上限的标志
{
if(!pos) //若计算到最后一位,return结果[2]。
return 1;
if(!fp&&dp[pos][state]!=-1) //若前一位不满足上限,并且dp[pos][state]已经确定,直接return,这里体现了记忆化搜索
return dp[pos][state];
int i,fpmax,ret=0; //fpm