保鏢排隊
(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...