不连续1的非负整数--我只会无脑的数位dp

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不连续1的非负整数--我只会无脑的数位dp相关的知识,希望对你有一定的参考价值。


题目


OJ平台

简单解题步骤

三步走:

  1. 转二进制序列
  2. dfs搜索
  3. 记忆化

代码详解

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,好好学)

Leetcode 600.不包含连续1的非负整数

Leetcode 600 不含连续1的非负整数

动态规划-数位dp-233. 数字 1 的个数

2022-02-21:不含连续1的非负整数。 给定一个正整数 n ,返回范围在 [0, n] 都非负整数中,其二进制表示不包含 连续的 1 的个数。 输入: n = 5 输出: 5 解释: 下面是带

LeetCode 600 不含连续1的非负整数[字典数 动态规划] HERODING的LeetCode之路