关注
/*
dfs实际上是个模拟
*/
//len表示判断的是哪一位
ll dfs(ll len,int maxi,int k,int f){
//dp[len][k][f]存储的是到长度为len为止,第k位为0和第k位为1的数是多少
//maxi标志的是上一位模拟的数是不是等于num的这一位的数
/*
我们还是拿100来举例子,因为最高位我们得到的一定为1,所以传进来的时候maxi就是1
那么我们第一位既可以模拟0也可是模拟1
模拟0的时候,i != a[len]所以maxi = false,之后也都是false
我们下一位就可以模拟00X跟01X,剩下的类似
模拟1的时候,i == a[len]所以maxi = true
我们就可以模拟1XX
但是由于这时a[2] = 0所以只能模拟10X
差不多就已经很清楚了
*/
//dp[len][k][f]这里其实就是记忆化搜索,如果之前出现过,就直接返回结果就好。
if(dp[len][k][f] != -1 && maxi == 0)
return dp[len][k][f];
//只有当第k位为1的情况这里才会加上1
if(!len)
return f;
ll cnt = 0;
int maxn = maxi ? a[len] : 1;
//i这里代表着第len位的数字是多少
//那么f||len == k && i就是判断这次模拟的数的第k位是否为1
for(int i = 0;i <= maxn;i++){
cnt += dfs(len - 1,maxi && i == a[len],k,f||len == k&&i);
}
//只有当maxi等于false的时候,我们模拟了下一位为0,1的全部情况,此时才更新dp的值
//表示不受之前的数的限制,所求的只是[0,1 << (len) - 1]]满足条件的数
return maxi ? cnt : dp[len][k][f] = cnt;
}
//二进制拆分数位,返回的结果是第k位为1的数总共有几个
ll div(ll num,int k){
memset(a,0,sizeof(a));
int index = 0;
while(num){
a[++index] = num % 2;
num /= 2;
}
return dfs(index,1,k,0);
}
E题最简单数位DP标程,本菜鸡的一点个人解读,希望可以帮到跟我一样的萌新新理解,个人一点愚见,如果有不正确的地方,还请大佬们们斧正ORZ
查看原帖
5 评论
相关推荐
03-28 00:43
杭州电子科技大学 C++
找工作勤劳小蜜蜂:矛盾是没有实习,就是没实战经验,公司不想要,公司不要,你就没有实习,你就进入死循环,另外你的项目不是社会现在有大量岗位存在行业用的,云存储人员早就饱和。 点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 这个offer值得去吗? #
36150次浏览 241人参与
# 实习生工资多少才算正常? #
73429次浏览 509人参与
# 在爱玛,骑向未来 #
42341次浏览 429人参与
# 如果春招能重来,我会___ #
31456次浏览 308人参与
# 实习生的蛐蛐区 #
954598次浏览 4812人参与
# 除了线上,还能去哪些地方投简历 #
16818次浏览 141人参与
# 蚂蚁集团笔试 #
31601次浏览 150人参与
# 非技术岗投递进展 #
178789次浏览 1324人参与
# 美团笔试 #
996909次浏览 5856人参与
# 产品每日一题 #
100019次浏览 720人参与
# 快手工作体验 #
337485次浏览 2962人参与
# 公司情报交流地 #
163550次浏览 1352人参与
# 你被哪些公司挂了? #
196546次浏览 1071人参与
# 那些我实习了才知道的事 #
294495次浏览 1813人参与
# 牛友的春节生活 #
122955次浏览 833人参与
# 腾讯工作体验 #
635667次浏览 3858人参与
# 你的秋招简历被谁挂了? #
942105次浏览 6051人参与
# 研究所VS国企,该如何选 #
272749次浏览 2031人参与
# 金融财会交流会 #
151337次浏览 500人参与
# 记录我的毕业季 #
5738次浏览 136人参与
# 第一份工作一定要去大厂吗 #
59284次浏览 380人参与
查看27道真题和解析