1. 程式人生 > >dp基礎之位移問題

dp基礎之位移問題

問題:求從0到N(包括N)的二進位制表示裡有多少個1?

動態規劃解決,分析:要求N的二進位制裡有多少個1,可以先求N去掉最後一位(N mod 2)後Y(Y = X>>1)裡有多少個1
子問題:f[i]表示數字i的二進位制裡有多少個1
f[i] = i>>1 + i mod 2
數字i的二進位制裡有多少個1 = i去掉最後一位裡的二進位制有多少個1 + i的最後一位(有可能是1或0)

初始狀態f[0] = 0,
計算順序:從f[0]...f[N]

時間複雜度達到O(n)

程式碼及註釋如下:

def Number_Of_One(N):
    #f[i]表示數字i的二進位制裡有多少個1
    f = [0 for i in range(N+1)]
    for i in range(1,N+1):
        f[i] = f[i>>1] + i%2
    return f
N = 5
print(Number_Of_One(N))

結果是:[0, 1, 1, 2, 1, 2]