关于数位dp的搜索,记忆化,的重点在于
limit&&i==up
(这一点我还没有完全理解)
对于限制的理解,关于高位和低位。
我们需要从高位开始 也就是pos,那么对于每一位我们可以先判断当前位数是不是题目中需要的限制条件,对于这个条件如果不满足,那么对于这个位数以后的位数,我们就需要对它进行限制,这样的话可以简化很多不必要的操作,进行dfs。
对于这个限制,我们需要考虑的点是
首先1
dfs 是用递归思想,那么我们需要找它结束循环的条件,和递归部分。
当我们的位数到达最低位时就说明要结束了,否则进行条件递归
2
当我们搜索的情况时,有可能是已经搜索过的,那么我们就只需要返回它的值就好了。
3
up对于限制,
它是否限制下一位数是否可以0-9,或者是num[pos]当前位数的最大值。
而对于限制条件,我们也需要是动态的条件。
还有一个函数solve这个是用来记录1-x的全部位数 然后进行dfs记忆化搜索也就是dp过程。
另外,还有一个想法是,对于x 以及y
那么我们要求y在x中重复的部分 x-y-1;
关于数位dp
限制条件
区间不包含4 和62 的个数
ispre 是6 limit表示有没有限制
int dfs(int pos,int ispre,int limit)
{
if(pos==0)
return 1;
if(dp[pos][ispre][limit]!=-1)
{
return dp[pos][ispre][limit];
}
int sum=0;
int up=limit?num[pos]:9;
for(int i=0; i<=up; i++)
{
if(ispre&&i==2)//出现62
continue;
if(i==4)//出现4
continue;
sum+=dfs(pos-1,i==6,limit&&i==up);//i==6是否为真 这个意味着下一次是否为6 限制着下一次的过程
}
return dp[pos][ispre][limit]=sum;
}
关于数位dp犯的错误是开long long
solve 忘开2
dp数组忘开 3
还有就是清零