動態規劃例題(二)

2022-06-18 11:42:10 字數 1300 閱讀 4155

給定乙個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進位制數中的 1 的數目並將它們作為陣列返回。例如:

輸入: 2

輸出: [0,1,1]

先分析,然後找規律,最後求解。

直接利用求二進位制的函式,進行統計「1」的數量統計即可

class solution:

def countbits(self, num: int) -> list[int]:

res=

for i in range(num+1):

return res

在做這一題的時候,二進位制之間的規律並不清楚,我就在本子上從0開始寫,然後規律就出現了

十進位制數字

轉為二進位制

『1』的個數00

0111

21013

112410015

1012

611027

1113

8100019

1001

2...

......

我們可以得到的資訊是:

1、偶數的二進位制末尾為0,奇數的二進位制末尾為1,所以第一n個數是奇數的情況下,第n個數字的二進位制中的『1』的個數一定比第(n-1)個數字二進位制中的『1』的個數多1個。

2、當第n個數字為偶數時,第n個數字的二進位制數右移一位就是第n/2的二進位制數(這個是二進位制的位運算),因為偶數二進位制末尾為『0』,故『1』的個數不變。

遞迴的**如下:

class solution:

def countbits(self, num: int) -> list[int]:

res=

for i in range(num+1):

return res

def count(self,num):

if num==0:

return 0

if num % 2==1:

return self.count(num-1)+1

return self.count(num//2)

利用遞迴總結的規律,記錄每一步的資訊,直接呼叫值計算即可

**如下:

class solution:

def countbits(self, num: int) -> list[int]:

res=[0]*(num+1)

for i in range(1,num+1):

res[i]=res[i>>1]+(i&1)

return res

動態規劃經典例題(二)

最長公共子列 輸入 abcfbc abfcab programming contest abcd mnp 輸出 420 解題思路 和最求最長上公升子列一樣,先設定乙個陣列儲存比較過的狀態maxlen,一步步的從子問題推到最終問題。設乙個二維陣列maxlen 最長公共子串ad cba1 111b 11...

動態規劃例題

題目描述 有一條很長的數軸,一開始你在0的位置。接下來你要走n步,第i步你可以往右走ai或者bi。問n步之後,0到m的每個位置,能不能走到?輸入格式 第一行,兩個整數n,m。接下來n行,每行兩個整數ai,bi。輸出格式 一行,一共m 1個數,每個數都是0或1表示能否走到,數字之間不用空格隔開。樣例輸...

《動態規劃》 ACM 動態規劃例題詳解

描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 圖1 圖1給出了乙個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到乙個和,你的任務就是找到最大的和。注意 路徑上的每一步只能從乙個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。輸...