动态规划
Lc338.比特位计数
https://leetcode-cn.com/problems/counting-bits/
1、确定dp数组的含义
dp[i]:整数i的二进制为1的个数
2、确定dp的递归函数
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
6 --> 110
7 --> 111
可以看出
if i % 2 == 0,dp[i] = dp[i/2]
if i % 2 == 1,dp[i] = dp[i/2] =1
由此引入位运算符>>,<<及&
"a >> b":将a所有二进制数向右移动b位数,同理可知<<
"a & b":参与运算的两数各对应的二进位相与,相同则为1.否则为0
3、确定初始条件
dp[0] = 0
代码:
func countBits(n int) []int {
//确定dp数组
dp := make([]int,n+1)
for i := 1; i <= n; i++ {
//递归函数
dp[i] = dp[i>>1] + i&1
}
return dp
}
总结:
动态规划“三步走”
1、确定dp数组的状态
2、确定dp递归函数
3、确定dp初始条件