標籤:部分 tle rac alt 序列 直接 概念 blog 大小
排列的問題,就是要把序列排個序,使之達到某種最優值或者統計方案數
dp可以解決部分排列問題。
通常的解決方案是,按照編號(優先順序)排序決策,從左至右決策兩種。
這裡主要是第一個。
排座位
? 有 ?? 個人坐成一排
? 對於相鄰兩個人 ??, ??
? 如果 ?? < ??,則會產生 ???? + ???? 的愉悅度
? 否則會產生 ???? + ???? 的愉悅度
? 求一個排列讓最大化愉悅度
? ?? ≤ 3000
從左至右決策,肯定就要狀壓了。
但是可以發現,我們並不關心一個i左右是誰,只關心編號和i的相對大小。
而且,這個貢獻ai,bj,ci,dj是可以獨立的。
思路就比較自然了。
我們按照編號從小到大決策。
每個點i的放置有幾種:
1.左右都比i小。
2/3.左/右比i大。
4.左右都比i大。
但是麻煩的是,如果直接dp可能最後形成不了一個序列。
不是一個整段。
所以,還要引入段的概念。
i的決策是:
1.左右都比i小,即串連之前的兩個段。
2/3.左/右比i大,另一個比i小,即串連一個段。
4.左右都比i大,即i自成一段。
每種中,i對答案的貢獻可以現場統計。
因為,我們的編號是從小到大處理的,
如果我們能夠正確串連的話,這個貢獻一定是可以算上的。
f[i][j]表示,處理完前編號i個,形成了j段的方案數。
還有一個問題是,邊界情況,沒有左/右,沒有這個貢獻。
那麼可以f[i][j][0/1][0/1]表示是否放了最左邊最右邊的。
答案:f[n][1][1][1]
Solution :
假定ai是一個1~n的數列。
對於合法的bi數列,乘上n!就是所有的ai和bi的情況了。
這樣,貢獻就比較好統計了。
dp[i][j][k]表示,處理bi中前i個位置,有j個是空的,貢獻是k的方案數。
看這篇題解:
其實還有一個題:(雖然不是dp)
有趣的家庭菜園
排座位&&Little Elephant And Permutation——排列dp的處理