這道題的狀態設計真是千奇百怪,有的做法每個點開了 \(8\) 個狀態,有的做法開了 \(4\) 個,我一直嘗試使這個數字變得更少,叉了幾個做法還是沒有成功,所以仍然是 \(4\) 個狀態。
傳送門: 風暴之眼
每種型別都有乙個穩定顏色,也就是說乙個型別的點一旦變成某個顏色就再也不能變化了,因此每個點從開始到結束最多變化一次。
因為輸入的終態是穩態,所以我們可以確定一些點的型別: 如果乙個點的鄰居存在和它顏色不一樣的點,那麼可以證明如果這個點是某種型別則這個狀態下一刻還會發生變化。
接下來設計狀態開始 dp。樹形 dp 的核心就是把每棵子樹作為子問題,並且通過子樹的結果推得自己的結果。
或許可以記錄每個點的初態和型別作為狀態,但是只記錄點的顏色或型別作為狀態無法考慮顏色傳遞的方向,導致同色連通塊陷入囚徒困境,即所有點都在等待他人更新。
因此轉移需要記錄每個點對父親的要求和可以為父親做出的貢獻。
討論乙個點的不同狀態,點的狀態可以分為四種:
這四個狀態互不重合且覆蓋了所有情況,分別用 \(0, 1, 2, 3\) 表示它們。其中 \(0, 1\) 狀態初態和終態相反,型別也已確定。\(2, 3\) 的初態和終態相同。狀態 \(3\) 是要求鄰居始終為自己終態的型別,\(0, 1, 2\) 是另一種型別。
設計狀態 \(f_\) 表示第 \(i\) 個點為狀態 \(j\),它子樹合法的方案數。前三個狀態的轉移是:
\[\begin
f_ &= \prod_ (f_[a_j = a_i] + f_[a_j \neq a_i])\\
f_ &= \prod_ (f_ + f_ + f_) - f_\\
f_ &= \prod_ (f_[a_j = a_i] + f_ + f_ + f_)\\
f_ &= [a_ = a_i]\prod_ (f_ + f_)[a_i = a_j]
\end
\]我們設乙個新的根 \(r\) 作為原來根 \(r\) 的父親,使它們終態相同。對於 \(r\) 初態不變的狀態,答案即為 \(f_ + f_\),對於 \(r\) 初態改變的狀態,取 \(f_\) 即可。
const unsigned long long mod(998244353);
inline void mn(unsigned& x)
unsigned long long ans(1);
unsigned m, n, a, b;
struct node n[200005];
inline void dfs(node* x, node* fa)
x->f[0] = c1;
x->f[1] = mod + c2 - c1, mn(x->f[1]);
x->f[2] = c3;
x->f[3] = c4;
}signed main()
不是現場選手,是朋友退役前推薦我做的,這絕對是我做過最困難的藍題。 囚徒困境 python
囚徒困境 若兩囚徒都認罪,則各判10年 乙個認罪乙個抵賴,則前者判1年,後者判20年 兩人都抵賴,各判3年。只有兩人都不認罪,程式才會停止。現在有乙個社會學家,在不同的人群中做這個實驗,一旦遇到都不認罪的情況,就停止該人群中的實驗。同時,他希望程式能記錄每一對實驗者的選擇,以及記錄第幾對實驗者都選擇...
囚徒困境困境 深入社會困境
囚徒困境困境 the new issue of pattern matching,onezero s weekly newsletter from senior writer will oremus,is out today.it takes a deep look at the social di...
囚徒困境新感
囚徒困境 是最為大家所討論的乙個博弈論模型,從競爭的角度來講 雙方都會選擇招供,這樣可以盡量遠離最大的損失,從合作的角度來講 雙方都會選擇緘默,這樣能夠使雙方存在乙個雙贏的局面 然而這種現象是最不會出現 由於經濟學的前提是假定人都是理性的 自私 在可預期的選擇上都會盡量遠離最大的損失,向著最大收益的...