int a[20];
ll dp[20][state];
ll dfs(int pos,/*state变量*/,bool lead/*前导零*/,bool limit)
{
if(pos==-1) return 1;
//第二个就是记忆化(在此前可能不同题目还能有一些剪枝)
if(!limit && !lead && dp[pos][state]!=-1) return dp[pos][state];
int up=limit?a[pos]:9;
ll ans=0;
for(int i=0;i<=up;i++)
{
if() ...
else if()...
ans+=dfs(pos-1,/*状态转移*/,lead && i==0,limit && i==a[pos]);
}
//计算完,记录状态
if(!limit && !lead) dp[pos][state]=ans;
return ans;
}
ll solve(ll x)
{
int pos=0;
while(x)
{
a[pos++]=x%10;
x/=10;
}
return dfs(pos-1/*从最高位开始枚举*/,/*一系列状态 */,true,true);
}
数位DP模板
最新推荐文章于 2024-01-16 20:11:54 发布