題目:
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 usingnamespace
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 個敢死隊員要炸掉敵人的乙個碉堡,誰都不想去,排長決定用輪迴數數的辦法來決定哪個戰士去執行任務。如果前乙個戰...