2020-03-01 23:08:51
問題描述:
你有一塊棋盤,棋盤上有一些格仔已經壞掉了。你還有無窮塊大小為1 * 2的多公尺諾骨牌,你想把這些骨牌不重疊地覆蓋在完好的格仔上,請找出你最多能在棋盤上放多少塊骨牌?這些骨牌可以橫著或者豎著放。
輸入:n, m代表棋盤的大小;broken是乙個b * 2的二維陣列,其中每個元素代表棋盤上每乙個壞掉的格仔的位置。
輸出:乙個整數,代表最多能在棋盤上放的骨牌數。
示例 1:
輸入:n = 2, m = 3, broken = [[1, 0], [1, 1]]
輸出:2
解釋:我們最多可以放兩塊骨牌:[[0, 0], [0, 1]]以及[[0, 2], [1, 2]]。
示例 2:
輸入:n = 3, m = 3, broken =
輸出:4
解釋:下圖是其中一種可行的擺放方式
限制:1 <= n <= 8
1 <= m <= 8
0 <= b <= n * m
問題求解:
最難考慮到的就是我們優先放置豎排,最後放置橫排即可遍歷當前行的所有可行解。
public int domino(int m, int n, int broken)本題的最優解是使用二分圖匹配匈牙利演算法求解,待更新。states[i] = state;
}for (int i = 1; i <= m; i++)
if (k == 0) break;}}
}}int res = 0;
for (int i = 0; i < 1 << n; i++) res = math.max(res, dp[m][i]);
return res;
}private int calc_1(int num)
private int calc_2(int num)
else
}return res;
}
狀態壓縮動態規劃
動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用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...