不连续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的主要内容,如果未能解决你的问题,请参考以下文章