Problem
每個 * 位置,可以任意替換成任何字串或者是空字串,是問是否有可能匹配主字串。
Sample Input
|
|
Sample Output
|
|
Solution
以 * 劃分,將其切割成好幾個 token,根據貪心原則只要按照順序出現這些 token 即可,因此盡可能靠左。
|
|
每個 * 位置,可以任意替換成任何字串或者是空字串,是問是否有可能匹配主字串。
|
|
|
|
以 * 劃分,將其切割成好幾個 token,根據貪心原則只要按照順序出現這些 token 即可,因此盡可能靠左。
|
|
對一個已經是 Chomsky normal form 的 CFG,問一個 string 是否在 CFG 之中。
|
|
|
|
因為 chomsky normal form 恰好劃分成兩個,定義字串 dp[l][r]
中可以解析出那些 nonterminal,藉由矩陣鍊乘積的方式,將其組合。最後檢查整個字串是否可以推回 start symbol。
|
|
還記得那些年我們已經經歷的災難嗎?PTC201410D!ZJOI 2012 DAY2!如果不記得,接著請聽我捏造個故事。
危險種這一類的怪物,不斷地在村莊肆虐作亂,並且不斷地靠近帝國首都,艾斯德斯大人受令狩獵帝國周圍的危險種。
根據情報顯示,危險種移動的路徑預估為有向無環圖,牠們的數個巢穴坐落於地圖的末端 (也就是不會在有別的地點抵達這個地方),而在首都前將有數個要塞,要塞正牠們的目標之地。為了阻止牠們到來,身為艾斯德斯大人的下屬,必須派軍隊前往危險種前往要塞的必經之地,即使抵達的位置無法阻止所有巢穴的危險種,但能對艾斯德斯大人貢獻一份心力便已足夠。
由於必經之地很多,好不容易在地圖上標記起來,卻又不知道哪個地點比較好 (可以阻止最多巢穴前往要塞)。正在困擾的同時,艾斯德斯大人已經將全部危險種給剷除了 …
「還沒一瞬間就將怪物解決,艾斯德斯大人啊! <(_ _)>
」
不過報告書還是得寫 …
輸入有多組測資。
每組測資第一行會有一個整數 N (N < 32767)。
接下來會有 N 行,第 i 行上會有數個整數 x,直到 0 表示結束,表示有一條邊從 i 到 x。
對於每組測資,輸出可以埋伏地點以及埋伏的最佳收穫情況。
|
|
|
|
|
目標從起始序列經過操作變成目標序列。
請問最少次數為何
|
|
|
|
很明顯地看出,任意插入就可以直接無視,只要找有最長共同子序列即可,剩餘的元素一次替除一次插入即可。
但是最長子序列在這一題無法使用 O(n * n)
的算法,因此將其轉換成 LIS 做法,由於元素恰好不重複,可以在 O(n log n)
完成 (轉換不造成元素增加)。
|
|
給一個天平表達式,請問至少要調整幾個權重才能使之平衡。
|
|
|
|
恰好是一棵二元樹,那麼可以得知道假使一個權重不改,最後的天平重量為何。
假使 depth 上的權重 w 不改,則最後的天平重量就是 w * pow(2, depth)。
藉此,可以記錄所有最後的天平重量,得知最多有多少不改 = N - 最少改變個樹。
|
|
每個變數皆為正整數,給定一個算術表達式和變數之間的大小關係,請問最少產生出來的答案為何。
|
|
|
|
先使用 spfa 找到根據 greedy 策略分配的變數值,如果發生負環情況直接輸出 -1
。
然後使用矩陣鏈乘積的 DP 方法進行找到最小答案。
|
|
將棋子移動到可以形成萬里長城,也就是說移動到同一行、或同一列、或其一對角線上。
求移動得最少步數。
|
|
|
|
窮舉要移動到哪裡,然後找完美匹配的最大權重 - KM 算法。
只要將移動步數弄成負權重套上去 KM 即可。
|
|
現在 pizza 上有 m 個橄欖,請問是否能均分 m 塊,使得每一塊皆有一個橄欖。
|
|
|
|
窮舉其中兩個相鄰橄欖中的所有分割點,檢查一下即可。
稍微估價一下,點多窮舉次樹就少,點少切割成功的機率就高,所以算法總不會太差。
|
|
給兩棵樹,請問將兩個樹用一條邊連起來,則獲得新的一棵樹的最長路徑期望值為何。
|
|
|
|
利用 dp 方法,找到通過點 v 的 (以 v 為路徑端點)最長路徑為何,以及兩棵樹分別原有的最長路徑為何。
接著考量是否加入新一條會成為最長路徑,也就是說會通過新增加的邊。分別對每個樹的節點構成的最長路徑做排序,接著窮舉連接的點,用二分搜索找到另一個樹的節點,能夠使之成為更長的最長路徑。
|
|
某 M 正與學姊討論蘿莉控追小海女的故事。
某 M 喃喃自語 …
『用了暴力法來完成的話,就能在調整 O(1) - O(E[x]) 完成。』
『如果用一個最常見的樹鏈剖分來完成也不過是 O(log n) - O(log^2 n)』
『在一般情況下,詢問次數肯定比調整次數來得高,想一想常數還得加上去,完全贏不了啊。』
學姊在一旁說到
『那如果是單純的二元樹,有比較好做嗎?說不定有更簡化的算法來完成?』
『說不定那個 … bitvertor 還是 bitset 能完成呢。』
『這個想法難不成是找到 lowbit 嗎?我沒有暫時想法。』某 M 這麼回答道。
『也許吧 … 我也不確定』學姊簇著眉。
某 M 發了瘋似的想了一個算法
『如果我們將其轉換成 k-ary search tree,也就是說需要將節點編號重新編成有大小關係,然後維護一個 BST 來查找 lower_bound 的結果,這麼一來就是 O(k log n) - O(log n) 了!』
『啊啊啊,這個方法不可行,』
學姊將鄙視般的眼神投向某 M。看來這場病還要持續很久。
『將題目弄成找樹前綴和好了,既然暴力法有期望值的剪枝,讓它剪不了不就好了!』
『你覺得不會被其他解法坑殺嗎 …』學姊如此擔憂地表示到。
『沒關係,吾等 M 可不是說假的』
給定一棵樹,樹根 root 編號 0,每個點一開始的權重為 0。
操作 x k: 將節點 x 的權重增加 k,請輸出從 x 到 root 的權重和。
輸入有多組測資,每組測資第一行會有一個整數 N (N < 32767),表示這棵樹有多少個節點。
接下來會有 N - 1 行,每一行上會有兩個整數 u, v (0 <= u, v < N) 表示 u, v 之間有一條邊。
接下來會有一行上有一個整數 Q (Q < 32767),表示接下來有 M 組詢問。
對於每個詢問結果輸出一行,請參照範例輸出的說明。
每組測資後空一行。
|
|
|
|
名為 “學姊”。
|