藍橋杯 敢死隊

2022-03-11 14:12:21 字數 1526 閱讀 3210

題目:

g將軍有一支訓練有素的軍隊,這個軍隊除開g將軍外,每名士兵都有乙個直接上級(可能是其他士兵,也可能是g將軍)。現在g將軍將接受乙個特別的任務,需要派遣一部分士兵(至少乙個)組成乙個敢死隊,為了增加敢死隊隊員的獨立性,要求如果一名士兵在敢死隊中,他的直接上級不能在敢死隊中。

請問,g將軍有多少種派出敢死隊的方法。注意,g將軍也可以作為乙個士兵進入敢死隊。

輸入格式

輸入的第一行包含乙個整數n,表示包括g將軍在內的軍隊的人數。軍隊的士兵從1至n編號,g將軍編號為1。

接下來n-1個數,分別表示編號為2, 3, ..., n的士兵的直接上級編號,編號i的士兵的直接上級的編號小於i。

輸出格式

輸出乙個整數,表示派出敢死隊的方案數。由於數目可能很大,你只需要輸出這個數除10007的餘數即可。

樣例輸入1

31 1

樣例輸出1

4樣例說明

這四種方式分別是:

1. 選1;

2. 選2;

3. 選3;

4. 選2, 3。

樣例輸入2

71 1 2 2 3 3

樣例輸出2

40資料規模與約定

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

對於40%的資料,n ≤ 100;

對於100%的資料,1 ≤ n ≤ 100000。

資源約定:

峰值記憶體消耗 < 256m

cpu消耗 < 2000ms

為寫這個題我專門去刷了一道樹形dp,就是公司party那道題,但後面又有人說這題不算樹形dp,是遞推,我也是懵逼的,但先看做樹形dp

第一次寫的時候我就按照普通樹形dp的格式下,當時寫的是乙個人去的時候就是將其所有子節點不去加起來,不去就是把子節點去與不去的和加進來,然後就沒過樣例

後來看了看別人的題解,一開始把dp陣列所有值都賦為1,乙個人去的時候的方案數就是把其所有子節點不去累乘起來,不去就是子節點去與不去的和累乘起來,這是用了乘法原理,比如其有m個結點,就分成m步,第一步就是看第乙個人去不去的方案數,第二步就是看第二個人去不去的方案數,一直到第m步,所以要用累乘。

最後結果-1是因為題目說過敢死隊最起碼要有1個人,而我們算的答案是包含所有人都不確定的

#include using

namespace

std;

typedef

long

long

ll;const

int maxn=1e5+7

;const

int mod=1e9+7

;const

double pi=acos(-1

);int dp[maxn][2

];vector

v[maxn];

intn;

void dp_rule(int

root)

}int

main()

dp_rule(1);

cout

<<(dp[1][0]+dp[1][1]-1)%mod

}

敢死隊問題

有m個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰士沒完成任務,則要再派乙個戰士上去。現給每個戰士編乙個號,大家圍坐成一圈,隨便從某乙個戰士開始計數,當數到5時,對應的戰士就去執行任務,且此戰士不再參加下一輪計數。如果此戰士沒完成任務,再從...

敢死隊問題

1.1.1分析論證 有m個敢死隊員要炸掉敵人的一碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰士沒完成任務,則要再派乙個戰士上去。現給每個戰士編乙個號,大家圍坐成一圈,隨便從某乙個戰士開始計數,當數到5時,對應的戰士就去執行任務,且此戰士不再參加下一輪計數。如果此戰...

不敢死隊問題

不敢死隊問題 timelimit 1000ms memory limit 65536k 題目描述 說到 敢死隊 大家不要以為我來介紹電影了,因為資料結構裡真有這麼道程式設計題目,原題如下 有m 個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰...