题目来源
题目描述
题目解析
二进制表示算法:
- 第一步: i mod 2 是最低位的bit
- 第二步: i <- floor(i/2),如果i = 0,结束;否则回到第一步
序列+位操作型动态规划
(1) 确定状态
- 观察一个数的二进制位:
- ( 170 ) 10 = ( 10101010 ) 2 (170)_{10} = (10101010)_2 (170)10=(10101010)2
- 最后一步:观察这个数最后一个二进制位(最低位),去掉它,看剩下多少个1
- ( 170 ) 10 = ( 10101010 ) 2 (170)_{10} = (10101010)_2 (170)10=(10101010)2,有4个1
- ( 85 = 170 / 2 ) 10 = ( 1010101 ) 2 (85=170/2)_{10} = (1010101)_2 (85=170/2)10=(1010101)2,有4个1
- 子问题:
- 原问题:要求N的二进制表示中有多少个1
- 子问题:在N的二进制去掉最后一位N mod 2 ,设新的数是Y=(X >> 1)(右移一位),要知道Y的二进制表示中有多少1
- 状态:
- f[i]:设f[i]表示i的二进制表示中有多少个1
(2) 转移方程
(3) 初始条件和边界情况
- 初始条件:f[0] = 0
(4) 计算顺序
- 从小到大 f[0]…f[N]
- 返回值f