動態規劃 狀態壓縮 707 最優賬戶結餘

2022-08-11 08:09:07 字數 1148 閱讀 4532

2020-04-07 16:52:12

問題描述:

給一有向圖,每一條邊用乙個三元組表示, 比如[u, v, w]代表權值為w的從uv的一條邊. 計算出保證每個點的權重相等需要新增的最少的邊數. 也就是說, 指向這一點的邊權重總和等於這個點指向其他點的邊權重之和.

樣例

樣例1

輸入: [[0,1,10],[2,0,5]]

輸出: 2

說明:需要新增兩條邊

它們是 [1,0,5] 以及 [1,2,5]

樣例2

輸入: [[0,1,10],[1,0,1],[1,2,5],[2,0,5]]

輸出: 1

說明:只需要新增一條邊 [1,0,4]

注意事項

注意 u ≠ v 且 w > 0

下標不一定是線性的, 比如 頂點下標可以為 0,1,2, 也可以為 0,2,6.

問題求解:

本題可以使用動態規劃來進行求解,對於乙個集合,如何其和為0,那麼就是乙個合法的子集,我們只需要去遍歷其合法的子集組成就可以得到最終的結果。

時間複雜度:o(2 ^ n)

public int balancegraph(int edges) 

int nums = new int[map.size()];

int len = 0;

for (int v : map.values())

}if (len == 0) return 0;

int dp = new int[1 << len];

arrays.fill(dp, integer.max_value / 2);

for (int i = 1; i < dp.length; i++)

}if (sum == 0) }}

}return dp[dp.length - 1];

}

狀態壓縮動態規劃

動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...

動態規劃 狀態壓縮

這個題目的題意很容易理解,在乙個n m的格仔裡,我們現在有兩種型別的磚塊,1 2和 2 1,問一共有多少種方案,可以將整個n m的空間都填滿。最簡單的例子就是下面的了 程式設計之美中題目 某年夏天,位於希格瑪大廈四層的微軟亞洲研究院對辦公樓的天井進行了一次大規模的裝修.原來的地板鋪有 n m 塊正方...

狀態壓縮動態規劃

我們可以使用乙個01串a來表示乙個集合。對於數x x 0 用ax 0表示它不在該集合中,用ax 1表示它在該集合中。將01串a看作是乙個二進位制數,我們把它轉換為十進位制,就可以使用乙個十進位制整數來表示乙個實際使用二進位制方式表示的集合。這樣,我們可以使用位運算方便地處理集合的操作。交集兩個集合a...