動態規劃 保鏢排隊

2021-06-10 04:42:41 字數 2207 閱讀 8343

保鏢排隊

(p3.pas/cpp/in/out)

【問題背景】

教主lhx作為知名人物,時刻會有****威脅他的生命。於是教主僱傭了一些保鏢來保障他的人生安全。

【題目描述】

教主一共僱傭了n個保鏢,編號為1~n。每個保鏢雖然身手敏捷武功高強,但是他在其餘n-1個保鏢裡,都會有乙個「上司」,他會對他的上司言聽計從。但一號保鏢例外,他武功蓋世,不懼怕其餘任何保鏢,所以他沒有上司。

教主lhx會對這n個保鏢進行定期視察。每次視察的時候,首先會讓所有保鏢排隊。

對於每個保鏢,在他心目中會對他的所有下屬的武功實力排個隊。

現在教主要求排出來的隊伍滿足:①互為上司-下屬的兩個保鏢,上司在前,下屬在後 ②對於乙個保鏢的所有下屬,武功實力較強的在前,較弱的在後。

教主想知道,總的排隊方法數除以10007的餘數是多少。

【輸入格式】

輸入的第一行為乙個正整數t,表示了資料組數。

對於每組資料:

第一行為乙個正整數n。

接下來n行,每行描述乙個保鏢。

第i+1行,會有乙個整數k,代表第i個保鏢的下屬個數,接下來k個數,代表第i個保鏢的下屬按照武功實力從高到低的編號。

【輸出格式】

輸出包括c行,每行對於每組資料輸出方案數mod 10007後的結果。

【樣例輸入】

2 2 3

2 4 5

2 2 3

2 4 5

2 6 7

【樣例輸出】

【樣例說明】

對於第1組資料,有以下3種排列是合法的:

1 2 4 3 5

1 2 3 4 5

1 2 4 5 3

同時滿足了1在2與3之前且2在3之前,2在4與5之前且4在5之前

【資料規模】

對於20%的資料,有n ≤ 9;

對於40%的資料,有對於所有k,有k ≤ 2;

對於60%的資料,有n ≤ 100;

對於100%的資料,有t ≤ 10,n ≤ 1000,k ≤ n。

這是一道比較水的樹形dp。

但是又爆零了,只是因為統計樹的度的時候統計錯了!!!就是dfs錯了!!!我想殺人呀。

因為到了空節點沒有跳出,還有統計度忘了加上根的1。。。

我是先將樹多叉轉二叉,因為根據題意,父親,和較大的兄弟必須排在自己之前,所以我用這種方法統一表示——只要是父親就必須在自己之前。

多叉轉二叉很容易實現。right[s] = left[i];left[i] = s;

而這道題的難點在數學上,即兩個序列,要把它們合併成乙個序列的方法總數。。我是乙個數學弱菜,所以沒有用排列組合公式推出來,於是我寫的樸素找的規律。

f(i,j)表示兩個序列的長度分別為i和j時,合併的方法總數,f(i,j) = f(i-1,j)+f(i,j-1)。所以f[u] = f[left[u]] * f[right[u]] * f[sum[left[u]]][sum[right[u]]]

其實這個很好推的,而且一開始我想到了,不知為何把它給否定了。(i + j)! / (i! * j!),也就是先隨便排,再分別除以i和j的全排列,因為兩個序列是毫不相干的。轉換一下就是c(i+j,j)。

#include #include #include long func[1100][1100];

long left[1110];

long right[1110];

long sum[1110];

long f[1110];

void dp(long u)

else if(left[u]&&right[u])

else if (left[u])

else if (right[u]) }

void dfs(long u)

dfs(left[u]);

dfs(right[u]);

sum[u] = sum[left[u]] + sum[right[u]] + 1;

}long getint()

do rs=(rs<<3)+(rs<<1)+tmp-'0';

while (isdigit(tmp=getchar()));

return sgn?rs:-rs;

}long tmp[1100];

int main()

} while (t--)

for (long j=1;j

Orz教主第6次模擬賽之保鏢排隊

只是一道比較典型的樹形dp題,基本上一看到就知道了,對吧,但是問題就在為什麼比賽時就是推不出來方程,就是問題了 好好反思一下。其次,就是做法了,來看看圖 這是一棵樹,一棵枝繁葉茂的樹。設g x 表示在x這個點為根的方案樹。設f n,m 表示n個數插進m個數中的方案數,這個預處理,f n,m f n ...

動態規劃 什麼是動態規劃?

先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...

mysql動態規劃 動態規劃

動態規劃 能夠動態規劃的問題具有以下特點 可分解成規模更小的子問題 子問題的結果可復用 關鍵是要理解狀態轉移方程的含義就好啦!數字三角形 問題描述 在數字三角形尋找從頂到底的路徑,使得路徑經過的數字之和最大。規定每一步只能往左下或右下走,求出最大路徑和。遞迴解法 include include us...