int dig[20];
ll dp[20][10];
ll Dfs(int pos,int pre,int lim,int first)
{
if(pos==-1) return 1;
if(!lim&&!first&&dp[pos][pre]!=-1) return dp[pos][pre];
int upper=lim?dig[pos]:9;
ll res=0;
for(int i=0;i<=upper;i++)
{
if(first||!first&&abs(pre-i)>=2) res+=Dfs(pos-1,i,lim&&i==upper,first&&!i);
}
if(!lim&&!first) dp[pos][pre]=res;
return res;
}
ll Calc(ll x)
{
int len=0;
while(x)
{
dig[len++]=x%10;
x/=10;
}
return Dfs(len-1,0,1,1);
}
数位DP模板
最新推荐文章于 2024-01-16 20:11:54 发布