动态规划 分奇数和偶数:
偶数:偶数的最低位一定是0,偶数是相当于被某个更小的数乘2,在二进制运算中,就是左移一位,也就是在低位多加1个0,那样就说明dp[i] = dp[i / 2],因为补0不影响1的个数
eg:6的二进制是110,3的二进制是11,在3的基础上左移一位末尾补0
奇数:奇数由不大于该数的偶数+1得到,偶数+1在二进制位上会发生什么?会在低位多加1个1,
(为什么不会产生进位,因为偶数的最低位一定是0,举例最小的偶数是2,其二进制是10,其他任何偶数都是通过2及以上的数字左移产生的,所以最低位必然是0)
那样就说明dp[i] = dp[i-1] + 1,当然也可以写成dp[i] = dp[i / 2] + 1
eg:6的二进制是110,7的二进制是111
class Solution {
public:
vector<int> countBits(int n) {
vector<int> dp(n + 1);
for (int i = 0; i <= n; i++) {
if (i % 2 == 0){
// i是偶数
dp[i] = dp[i / 2];
}
else{
//i是奇数
dp[i] = dp[i / 2] + 1;
}
}
return dp;
}
};