日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1049. 最后一块石头的重量 II

發(fā)布時(shí)間:2024/5/17 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1049. 最后一块石头的重量 II 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1049. 最后一塊石頭的重量 II

無論按照何種順序粉碎石頭,最后一塊石頭的重量總是可以表示成

可以這樣理解,將所有的石頭分為兩堆,ki=1的石頭是一堆,ki=-1的石頭是另一堆,我們的目標(biāo)就是求上述和式的最小非負(fù)值,即這兩堆石頭重量之差的絕對值diff也是所有劃分當(dāng)中最小的。

記所有石頭的總重量為sum,ki=-1的石頭重量之和是neg,則ki=1的石頭的重量之和為sum-neg。

則有:

要使最后一塊石頭的重量盡可能地小,neg需要在不超過sum/2的前提下盡可能地大。

因此本問題可以看作是背包容量為sum/2,物品重量和價(jià)值均為stonesi的 0-1 背包問題。

定義二維布爾數(shù)組dp,dp[i+1][j]表示前 i 個(gè)石頭能否湊出重量 j。

dp[0][] 為不選任何石頭的狀態(tài),因此除了 dp[0][0] 為真,其余dp[0][j] 全為假。

對于第 i 個(gè)石頭,考慮湊出重量 j:

  • 若 j<stones[i],則不能選第 i 個(gè)石頭,此時(shí)有 dp[i+1][j]=dp[i][j];
  • 若 j≥stones[i],存在選或不選兩種決策,不選時(shí)有dp[i+1][j]=dp[i][j],選時(shí)需要考慮能否湊出重量 j?stones[i],即 dp[i+1][j]=dp[i][j?stones[i]]。若二者均為假則 dp[i+1][j] 為假,否則dp[i+1][j] 為真。

因此狀態(tài)轉(zhuǎn)移方程如下:

求出dp[n][] 后,所有為真的 dp[n][j] 中,最大的 j 即為 neg 能取到的最大值。

代入 sum?2?neg 中即得到最后一塊石頭的最小重量。

由于 dp[i+1][] 的每個(gè)元素值的計(jì)算只和 dp[i][] 的元素值有關(guān),因此可以使用滾動(dòng)數(shù)組的方式,去掉 dp 的第一個(gè)維度。

Code

Python

class Solution:def lastStoneWeightII(self, stones: List[int]) -> int:total = sum(stones)n, m = len(stones), total // 2dp = [False] * (m + 1)dp[0] = Truefor weight in stones:for j in range(m, weight - 1, -1):dp[j] |= dp[j - weight]ans = 0for j in range(m, -1, -1):if dp[j]:ans = total - 2 * jbreakreturn ans

總結(jié)

以上是生活随笔為你收集整理的LeetCode 1049. 最后一块石头的重量 II的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。