在一排樹中,第i
棵樹產生tree[i]
型的水果。
你可以從你選擇的任何樹開始,然後重複執行以下步驟:
把這棵樹上的水果放進你的籃子裡。如果你做不到,就停下來。
移動到當前樹右側的下一棵樹。如果右邊沒有樹,就停下來。
請注意,在選擇一顆樹後,你沒有任何選擇:你必須執行步驟 1,然後執行步驟 2,然後返回步驟 1,然後執行步驟 2,依此類推,直至停止。
你有兩個籃子,每個籃子可以攜帶任何數量的水果,但你希望每個籃子只攜帶一種型別的水果。
用這個程式你能收集的水果總量是多少?
示例 1:
輸入:[1,2,1]輸出:3解釋:我們可以收集 [1,2,1]。示例 2:
輸入:[0,1,2,2]輸出:3解釋:我們可以收集 [1,2,2].示例 3:如果我們從第一棵樹開始,我們將只能收集到 [0, 1]。
輸入:[1,2,3,2,2]輸出:4解釋:我們可以收集 [2,3,2,2].示例 4:如果我們從第一棵樹開始,我們將只能收集到 [1, 2]。
輸入:[3,3,3,1,2,1,1,2,3,3,4]輸出:5解釋:我們可以收集 [1,2,1,1,2].動態規劃(dp)。首先分析題意,不要被花裡胡哨的東西嚇到,尋找數學本質,就已經快做出來了。這個問題的數學本質是,求解最長連續子陣列的長度,子陣列滿足僅有兩種元素。於是,對於有經驗的同學必然會發現,子陣列,子串行等問題8成都是動態規劃可以解。如果我們從第一棵樹或第八棵樹開始,我們將只能收集到 4 個水果。
解題思路:
假設,dp[i]=;是以陣列下標i結尾的最長子陣列,其中v1是tree[i],v2是除tree[i]之外的另乙個元素,v3是最長連續長度。注意v1,v2可能是同乙個數。於是很容易發現如下的遞推關係:
tree[i+1]==dp[i][0],dp[i+1]=;
tree[i+1]==dp[i][0],dp[i+1]=;
其他,元素發生變化,必然是tree[i+1]與tree[i]構成的二元組,長度是tree[i]連續長度len+1。
由此可知,還需要求解tree[i]的最長連續長度len,這個不難。從1,2,3的遞推關係可以發現,dp始終只用到前乙個元素,因此陣列空間可以降維度,最終額外的空間o(1),時間複雜度o(n)。最終需要更多細節請看下面**:
904 水果成籃
weekly contest 102的第一題水果成籃 在一排樹中,第 i 棵樹產生tree i 型的水果。你可以從你選擇的任何樹開始,然後重複執行以下步驟 把這棵樹上的水果放進你的籃子裡。如果你做不到,就停下來。移動到當前樹右側的下一棵樹。如果右邊沒有樹,就停下來。請注意,在選擇一顆樹後,你沒有任何...
904 水果成籃
你正在探訪一家農場,農場從左到右種植了一排果樹。這些樹用乙個整數陣列 fruits 表示,其中 fruits i 是第 i 棵樹上的水果 種類 你想要盡可能多地收集水果。然而,農場的主人設定了一些嚴格的規矩,你必須按照要求採摘水果 你只有 兩個 籃子,並且每個籃子只能裝 單一型別 的水果。每個籃子能...
lc904水果成籃
在一排樹中,第 i 棵樹產生 tree i 型的水果。你可以從你選擇的任何樹開始,然後重複執行以下步驟 把這棵樹上的水果放進你的籃子裡。如果你做不到,就停下來。移動到當前樹右側的下一棵樹。如果右邊沒有樹,就停下來。請注意,在選擇一顆樹後,你沒有任何選擇 你必須執行步驟 1,然後執行步驟 2,然後返回...