Classy Numbers

Classy Numbers

https://ac.nowcoder.com/acm/problem/113062

思路:

了解过数位的,这题一定是可以写出来的.
我们用表示到了第i位无限制的条件下填了~的方案数.然后对于限制和非限制进行一个讨论即可.就是一个简单的递归,最后答案是.
但是有个细节值得注意,了我一会,就是你应该放到返回答案的前面,不然就会出..数组越界.(因为我只开了.)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=21,M=4;
ll f[N][M];//到了第i位无限制的条件下填了j个1~9的方案数.
int a[N];
ll dfs(int len,int num,int limit)
{
    if(num>3)    return 0;
    if(!limit&&f[len][num]!=-1)    return     f[len][num];
    if(len==0)    return 1;    
    ll res=0;    
    if(limit)
    {
        for(int i=0;i<=a[len];i++)
        {
            if(i<a[len])    res+=dfs(len-1,num+(i!=0),!limit);
            else            res+=dfs(len-1,num+(i!=0),limit);
        }
    }
    else
    {
        res+=dfs(len-1,num,limit);
        res+=9ll*dfs(len-1,num+1,limit);
    }
    if(!limit)        return f[len][num]=res;
    else            return res;
}

ll solve(ll x)
{
    int id=0;
    if(x==0)    return 1ll;
    while(x)    a[++id]=x%10,x/=10;
    return dfs(id,0,1);
}

int main()
{
    int T;cin>>T;
    memset(f,-1,sizeof f);
    while(T--)
    {
        ll l,r;cin>>l>>r;
        printf("%lld\n",solve(r)-solve(l-1));
    }
    return 0;
}

应该是高质量的题解.

全部评论
%%%
点赞 回复 分享
发布于 2021-02-08 17:55

相关推荐

06-26 15:35
武汉大学 运营
点赞 评论 收藏
分享
迟缓的斜杠青年巴比Q...:简历被投过的公司卖出去了,我前两天遇到过更离谱的,打电话来问我有没有意向报班学Java学习,服了,还拿我学校一个学长在他们那报班学了之后干了华为OD当招牌
点赞 评论 收藏
分享
大飞的诡术妖姬:之前看b站多明海有个说法,日本就业竞争非常低的原因不光是毕业学生少,还有很多人干两年不喜欢职场氛围就辞职躺平,位置也空了很多,论吃苦耐劳还得看咱们
点赞 评论 收藏
分享
评论
6
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务