動態規劃 花壇種花問題

2021-10-13 17:13:47 字數 1654 閱讀 6847

新年的第一道每日一題,因為之前找到工作之後想著休息一段時間,演算法的練習有所懈怠,希望開年能有乙個好運氣!

題目大意:

假設有乙個很長的花壇,一部分地塊種植了花,另一部分卻沒有。可是,花不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。

給你乙個整數陣列 flowerbed 表示花壇,由若干 0 和 1 組成,其中 0 表示沒種植花,1 表示種植了花。另有乙個數 n ,能否在不打破種植規則的情況下種入 n 朵花?能則返回 true ,不能則返回 false。

輸入:flowerbed = [1,0,0,0,1], n = 1

輸出:true

# 根據題意,很明顯,這是一道動態規劃的題目,那麼我們需要來劃定狀態。

定義 dp[i]:從0到第i個(包含i)地塊,可以種植 dp[i] 朵花。

# 轉移方程;只有在自身以及前後位置都沒有花朵的情況下才能種植。

if flowerbed[i-1]

==0 && flowerbed[i]

==0 && flowerbed[i+1]

==0

flowerbed[i]

= 1;

dp[i]

= dp[i-1]+1;

else

dp[i]

= dp[i-1]

;# 最後乙個位置需要特殊考慮;這也是我第一下提交失敗的原因

**示例

public

boolean

canplaceflowers

(int

flowerbed,

int n)

// base

if(flowerbed[0]

==0&& flowerbed[1]

==0)else

for(

int i=

1; i1; i++

)else

}// 最後乙個位置單獨考慮

if(flowerbed[len-2]

==0&& flowerbed[len-1]

==0)else

return dp[length-1]

>= n ?

true

:false

;}

根據分析其實這是一種跳格仔的方法,如果我們遇到 1 的地塊,下一塊一定不能種,那麼我們直接跳過;

如果該地塊為 0 ,那我們只需檢查後乙個地塊是否為0(因為按照上文跳躍前進,前乙個格仔我們無須檢查,一定是1),後一塊為0,那麼這裡就可以種植,n–; 同時這一塊就變成了情況一,向後跳躍兩格;如果後一塊為 1,那麼這一塊不能種植,且後兩塊也不能種植,因此向後跳三格

public

boolean

canplaceflowers

(int

flowerbed,

int n)

else

if(i==flowerbed.length-

1|| flowerbed[i+1]

==0)else

}return n<=0;

}

leetcode 種花問題

假設你有乙個很長的花壇,一部分地塊種植了花,另一部分卻沒有。可是,花卉不能種植在相鄰的地塊上,它們會爭奪水源,兩者都會死去。給定乙個花壇 表示為乙個陣列包含0和1,其中0表示沒種植花,1表示種植了花 和乙個數 n 能否在不打破種植規則的情況下種入 n 朵花?能則返回true,不能則返回false。示...

動態規劃問題

思想 如果乙個問題是由交疊的子問題所構成,那麼我們就可以用動態規劃技術來解決它。一般來說,這樣的子問題出現在對給定問題求解的遞迴關係中。這個遞推關係包含了相 同問題的更小子問題的解。動態規劃法建議,與其對交疊子問題一次又一次的求解,不如把每個較小子問題只求解一次並把結果記錄在表中。例題 0 1揹包問...

動態規劃問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 ctest有n個蘋果,要將它放入容量為v的揹包。給出第i個蘋果的大小和價錢,求出能放入揹包的蘋果的總價錢最大值。輸入 有多組測試資料,每組測試資料第一行為2個正整數,分別代表蘋果的個數n和揹包的容量v,n v同時為0時結束測試,...