Problem
N 個人不同高,現在佔一排,任挑三個人的身高從左向右的相對高度,不存在矮、高、中的情況有多少種。
Sample Input
|
|
Sample Output
|
|
Solution
卡塔蘭數 (Catalan number)。
每一次考慮加入一個最高的人,窮舉最高的人應該佔在哪個位置,則其左、右側也要滿足定義,同時左側的人都要比右側的人高。最後得到公式如下,與卡塔蘭數相同。
|
|
N 個人不同高,現在佔一排,任挑三個人的身高從左向右的相對高度,不存在矮、高、中的情況有多少種。
|
|
|
|
卡塔蘭數 (Catalan number)。
每一次考慮加入一個最高的人,窮舉最高的人應該佔在哪個位置,則其左、右側也要滿足定義,同時左側的人都要比右側的人高。最後得到公式如下,與卡塔蘭數相同。
|
|
有 N 個人的愛書俱樂部,他們會喜歡某些人的書,如果相互喜歡對方的書就可以進行交換,現在要問的是否每個人都能找到能夠交換的對象,讓每個人都獲得新書。
如果 A -> B, B -> C, C -> A,那麼他們可以環狀地交換新書。
|
|
|
|
每個人只能找一個對象進行交換,找二分圖的 perfect matching。
二分圖中左側是每個人,右側是想要交換的對象,兩邊的個數都是 N。匹配完會找到數個環狀,這就是最後的交換情況。然而由於點數很多,用匈牙利算法可以減枝來加快,每一次擴充路徑都必須得成功。如果使用 maxflow,則盡可能減少邊的無效使用。
當然可以使用 maxflow 貪心預流、匈牙利貪心匹配過後,再套用算法,速度有可能會快上許多,以下的模板還真好用,減少無效使用於分層圖,所以速度快上很多。
|
|
在國家公園的步行路道上要在兩側放置花卉,而主辦單位認為只要在其中兩個重要景點的最短路徑上的道路放置即可。通常大部分人只會走最短路徑。
請問總花費為何?
|
|
|
|
最短路徑可能有數條,因此要窮舉每一條邊是否在最短路徑上,已知景點分別為 st 和 ed ,那麼找到 st -> u 和 ed -> v 的單源最短路徑,接下來窮舉 u -> v ,加上 st -> u 和 v -> ed ,得到 st -> u -> v -> ed 的最少花費,檢查是否等於最短路徑長即可。
這一題是雙向圖,如果是單向圖則要反轉邊,才能對 ed 進行單源最短路徑 (SSSP)。在這一題寫 SSSP 使用 SPFA 算法,也許 dijkstra 也是挺不錯的。
|
|
現在給定格子狀的街區,每一個街區只會與垂直、水平的相鄰街區有通行的人行道。現在已知每個街區有多少人行道,求未知的街區人行道數量情況。
|
|
|
|
二分圖黑白染色,知道每一個只會與相鄰上下左右的街區相鄰,那麼就像國際象棋一樣的黑白染色,相鄰的人行道一定只會連接於黑跟白之間。
分別計算黑和白的 degree 總數,差的絕對值就是未知街區的答案。
|
|
從隨機幾點進行觀察,可以知道其相對高度。
現在給定數組觀察的部分紀錄,求在某一點的觀察的數據,如果可以得到完整的則輸出整個地圖的相對高度,如果不齊全、或者發生矛盾,則參考範例輸出。
|
|
|
|
不斷地部分記錄進行更新。
|
|
給定 N 條邊,去除掉同構的情況,請問有多少個不同的串并連網路。
|
|
|
|
首先,拆分結果可以依序按照串-并-串-并 … 或者并-串-并-串 …
這樣會形成樹圖,其中奇數層是串/并,而偶數層是并/串,如此一來,要找到 N 個葉節點的樹有多少不同種的。根據兩種不同的分層方式,隨後乘上 2 就是答案。
定義 dp[i][j]
表示總共有 j 個葉節點的樹,並且每個子樹的葉節點最多 i 個 (至少)。這麼定義有它的好處,而不去直接定義 恰好 。
接著組合其具有 k 個樹-其子樹最多 i 個葉節點,剩下不足的葉節點,弄成一個樹,使用重複排列防止重複的計算。
|
|
有 N 堆石頭,每次選一堆,只能不能拿大於一半的石頭總數。
求兩個人都採用最佳策略,請問誰輸誰贏。
|
|
|
|
建造 SG 函數進行觀察,接著直接套用 SG 函數的 nim 規則。
關於 SG
让我们再来考虑一下顶点的SG值的意义。当g(x)=k时,表明对于任意一个0<=i<k,都存在x的一个后继y满足g(y)=i。也 就是说,当某枚棋子的SG值是k时,我们可以把它变成0、变成1、……、变成k-1,但绝对不能保持k不变。不知道你能不能根据这个联想到Nim游戏, Nim游戏的规则就是:每次选择一堆数量为k的石子,可以把它变成0、变成1、……、变成k-1,但绝对不能保持k不变。这表明,如果将n枚棋子所在的顶 点的SG值看作n堆相应数量的石子,那么这个Nim游戏的每个必胜策略都对应于原来这n枚棋子的必胜策略!
對於博弈,一直以來盡可能靠記憶化搜索 dp 完成,寫題基本上也還算過得去,在大數據的題目上,除了幾個噁心的數學分析外,利用記憶化搜索進行小數據觀察,真的沒搞頭的題目,大多解法是所謂的 SG 函數 (Sprague-Grundy)。
再不學點新的,就要沒有看得懂的題目可以刷了 … 如果因為看不懂題目,而增加對英文的仇恨值,都不知道溢位幾個世紀去了。
SG 函數簡單而言是對於針對某一類型的博弈遊戲,可以轉換成 Nim 遊戲,每一個 SG 函數的 value 對應 Nim 遊戲中一堆石頭的個數。新世界!
|
|
查找區間內,相鄰 k 個質數中,滿足最大減最小恰好為 s 的情況有多少個。
|
|
|
|
a, b 大小簡直不可思議,就算能做到全搜索,建表時間是線性,也必須跑上 20 億乘上 20。
先做一次 sieve,接著對 [a, b]
進行 local sieve,題目雖然沒說明 b - a 的大小,實際看來是非常小的。
|
|
跳舞機共有四個方向,兩隻腳必須在某一個時刻按到該按鈕。
|
|
一開始雙腳站立於 0 的位置,每一個時刻只能移動一隻腳。
每一次移動的花費,0 到任何位置都是消耗體力 2、其餘數字移動到相鄰格子消耗體力 3、其餘數字移動到相面格子消耗體力 4,腳不動消耗體力 1。
過程中雙腳不能站立於同一個格子。
|
|
|
|
dp[i][j][k]
分別記錄時刻 i,左腳所在位置 j,右腳所在位置 k。分別進行轉移即可。
|
|
有一個 N 節點的樹,要架設服務的 server,必須滿足所有葉節點到最近的 server 距離小於等於 M。一開始會給定一個架好的 server。
求最少的放置個數。
|
|
|
|
針對加好的 server,將這個 server 當作 root,將 tree 轉換成 rooted tree,接著使用貪心。
盡可能放置越遠越好,根據 dfs 搜索的順序,查看內部節點 u,其子樹最遠的葉節點深度為何,以及子樹內部距離最近的 server 所在。
共計三種可能
|
|