HDOJ 5787 K-wolf Number 数位DP

数位DP的一道所谓的水题!

但是呢,必须得胆子大!

题意:求区间【L,R】中有多少个满足条件的十进制数

条件是:任意连续K个数值都不相同,K=2,3,4,5


dp最难的是设计状态和状态转移啊!

K很小,所以可以每一个有意义的数位都来一维来表示呗

dp[pos][p1][p2][p3][p4]

pos表示当前位,p4表示前一位。这里要考虑前导0的情况,p4=10的时候表示前一位为0

然后呢,最特殊的情况是:全是0的情况


转移呢,枚举即可

判断条件要根据K来说咯,如果K=2,那么当前枚举的这一位不等于p4

K=3,4,5是同理的


代码如下:

#include<bits/stdc++.h>
using namespace std;

#define LL __int64

const int maxn=25;
int K,digit[maxn];
LL dp[maxn][11][11][11][11];

bool check(int p1,int p2,int p3,int p4,int u){
    if (K==2) return u!=p4;
    else if (K==3) return u!=p4&&u!=p3;
    else if (K==4) return u!=p4&&u!=p3&&u!=p2;
    else return u!=p4&&u!=p3&&u!=p2&&u!=p1;
}

LL dfs(int pos,int p1,int p2,int p3,int p4,bool flag){
    if (pos==0) return p4!=10;
    if (flag&&dp[pos][p1][p2][p3][p4]!=-1) return dp[pos][p1][p2][p3][p4];
    LL res=0;
    int maxnum=flag?9:digit[pos];
    for(int i=0;i<=maxnum;i++){
        if (p4==10&&i==0)
            res+=dfs(pos-1,10,10,10,10,flag||i<maxnum);
        else if (check(p1,p2,p3,p4,i))
            res+=dfs(pos-1,p2,p3,p4,i,flag||i<maxnum);
    }
    if (flag) dp[pos][p1][p2][p3][p4]=res;
    return res;
}

LL calc(LL x){
    int len=0;
    while(x){
        digit[++len]=x%10;
        x/=10;
    }
    return dfs(len,10,10,10,10,0);
}

int main(){
    //freopen("input.txt","r",stdin);
    LL L,R;
    while(scanf("%I64d%I64d%d",&L,&R,&K)!=EOF){
        memset(dp,-1,sizeof(dp));
        printf("%I64d\n",calc(R)-calc(L-1));
    }
    return 0;
}

注意:

在数位dp分隔数位的时候

一定是digit【++len】而不是digit【len++】

一方面是因为最后的初始边界是len==0,就算 改成len==-1也是不行的

因为:dp的初始化会导致有问题

全部评论

相关推荐

2025-12-24 08:50
已编辑
上海工程技术大学 数据分析师
9.21-28参加第一轮七牛云秋招项目比赛,三人组队做一个AI角色对话网站。我们的目标是争取拿offer和前16名的奖金(最低500元)10.11打电话通知我们准备参加终面10.14参加终面(官网上说就一次终面),面试官为技术人员。我们来回路程4小时。10.23打电话通知我们,进了前20,10.27还有一次路演面试,评出前16名10.27再次参加终面,面试官为高管。来回路程4小时,告知我们一周内出结果。10.31在群里询问是否出结果,没有回复。11.5公司人员告知第一批有一波通知结果了,另外还有一波。11.12一位队员收到offer,两位队员被拒绝,评奖没消息。12.2在群里询问公司人员是否有消息,一位公司人员退群,没有回复。12.4在群里询问公司人员是否有消息,说是会帮忙反馈。12.12我们打听到HR主动告知某位参赛选手获奖500元。12.13在群里询问是否有消息,公司人员说在最终确认中,近期会联系,或者通过官网了解情况。12.23在群里询问是否有结果,公司人员告知没有获奖。————分割线————图1图2为群里聊天记录,图3为奖项设置,可怜的学生党为了个offer和500块都被硬拖3个月。我说实话辛苦了一周做项目参加比赛,没有offer,没有获奖也是做好心理准备的,但是不能这么无视我们的消息,并且拖着我们三个月吧。所有的方案、代码、产品说明文档等等参赛资料都是公开透明提交给公司的,我在的群参赛者大群是第11个,200多人,最多三人一队,有两批比赛,所以至少上百个队伍,上百个方案吧,很难说不是白嫖这么大规模的方案和创意。中间在群里问比赛结果,每次要么是不回复,要么是说问问负责人,还在确定中等等,然后就拖着。10月23号前20都已经出来了,排个名次要整整2个月吗?一直到今天12月23号跟我们说没获奖(不知道是不是因为队员没有接受他们offer的原因,给的薪资白菜价,所以队员拒绝了offer)官网说的第一批十月中旬公布结果,结果到现在花了3个月时间,之前有别人说是不是来窃取创意的,我还说这么大公司不至于吧。现在看来就是来白嫖方案的,做项目做了一个星期,后面又花精力,又花时间的做PPT搞了两次终演,最后因为队伍不是公司招聘候选,所以这么无视我们?
程序员小白条:七牛云好几年这样的事情了,这玩意都是潜规则搞好的,没啥,能有这能力的,说实话也不去七牛云了
秋招落幕,你是He or...
点赞 评论 收藏
分享
2025-12-18 11:59
广州南方学院 C++
牛客78682892...:直接点还好,总比要了简历也不回的强
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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