題意:
在大家的三連助攻下,tt 一舉獲得了超級多的貓咪,因此決定開一間貓咖,將快樂與大家一同分享。並且在開業的那一天,為了紀念這個日子,tt 在貓咖門口種了一棵蘋果樹。
一年後,蘋果熟了,到了該摘蘋果的日子了。已知樹上共有 n 個節點,每個節點對應乙個快樂值為 w[i] 的蘋果,為了可持續發展,tt 要求摘了某個蘋果後,不能摘它父節點處的蘋果。
tt 想要令快樂值總和盡可能地大,你們能幫幫他嗎?
input:
結點按 1~n 編號。
第一行為 n (1 ≤ n ≤ 6000) ,代表結點個數。
接下來 n 行分別代表每個結點上蘋果的快樂值 w[i](-128 ≤ w[i] ≤ 127)。
接下來 n-1 行,每行兩個數 l k,代表 k 是 l 的乙個父節點。
輸入有多組,以 0 0 結束
output:
每組資料輸出乙個整數,代表所選蘋果快樂值總和的最大值。
sample input:71
1111
111 37 4
2 34 5
6 43 5
0 0sample output:
5思路:
這是一道樹形dp題。
dp[i][j]表示以i為根節點的子樹的快樂值,j=0表示不選這棵樹,j=1表示選擇選擇這棵樹。用到了遞迴的思想,答案的最後結果應該是max(dp[root][0],dp[root][1]).
**:
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int maxn=
6010
;struct point
tree[maxn]
;bool root[maxn]
;int dp[maxn][2
];int ans;
voi***(
int i)
}int
main()
for(
int i=
1;i<=n;i++
) cin>>tree[i]
.w;for
(int i=
1;i<=n;i++
)//初始化
for(
int i=
1;i)int rot;
for(
int i=
1;i<=n;i++)pp
(rot)
; ans=
max(dp[rot][0
],dp[rot][1
]); cout<}}
Week13 作業 必做
a tt 的神秘任務1 這一天,tt 遇到了乙個神秘人。神秘人給了兩個數字,分別表示 n 和 k,並要求 tt 給出 k 個奇偶性相同的正整數,使得其和等於 n。例如 n 10,k 3,答案可以為 4 2 4 tt 覺得這個任務太簡單了,不願意做,你能幫他完成嗎?本題是spj input 第一行乙個...
Week13作業 C TT的獎勵 dp
在大家不辭辛勞的幫助下,tt 順利地完成了所有的神秘任務。神秘人很高興,決定給 tt 乙個獎勵,即白日做夢之撿貓咪遊戲。撿貓咪遊戲是這樣的,貓咪從天上往下掉,且只會掉在 0,10 範圍內的整數。tt 初始站在位置五上,且每秒只能在移動不超過一公尺的範圍內接住掉落的貓咪,如果沒有接住,貓咪就會跑掉。例...
week13作業B TT的神秘任務2
題目 在你們的幫助下,tt 輕鬆地完成了上乙個神秘任務。但是令人沒有想到的是,幾天後,tt 再次遇到了那個神秘人。而這一次,神秘人決定加大難度,並許諾 tt,如果能夠完成便給他乙個獎勵。任務依舊只給了兩個數字,分別表示 n 和 k,不過這一次是要求 tt 給出無法被 n 整除的第 k 大 的正整數。...