不连续1的非负整数--我只会无脑的数位dp
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不连续1的非负整数--我只会无脑的数位dp相关的知识,希望对你有一定的参考价值。
题目
简单解题步骤
三步走:
- 转二进制序列
- dfs搜索
- 记忆化
代码详解
class Solution {
public:
//s用于转二进制序列,sz存长度,memo用于记忆化
string s;
int sz;
int memo[2][100];
//将n转为二进制str,顺便进行一些数据的初始化
void handle(int n) {
while (n) {
if (n & 1) {
s = "1" + s;
} else {
s = "0" + s;
}
n >>= 1;
}
memset(memo, 0, sizeof(memo));
sz = s.size();
}
int findIntegers(int n) {
handle(n);
return dp(true, 0, 0);
}
//记忆化搜索基本模板,备忘录一般与前面一位的选择和当前是哪一位相关。
int dp(bool limit, int pre, int pos) {
if (pos == sz)
return 1;
if (memo[pre][pos] && !limit)return memo[pre][pos];
int up = limit ? s[pos] - '0' : 1;
int res = 0;
for (int i = 0; i <= up; i++) {
if (pre == 1 && i == 1)
continue;
res += dp(limit && i == (s[pos] - '0'), i, pos + 1);
}
if (!limit)memo[pre][pos] = res;
return res;
}
};
以上是关于不连续1的非负整数--我只会无脑的数位dp的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 68. 文本左右对齐 / 1894. 找到需要补充粉笔的学生编号 / 600. 不含连续1的非负整数(数位dp,好好学)
2022-02-21:不含连续1的非负整数。 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数。 输入: n = 5 输出: 5 解释: 下面是带