探險隊長凱因意外的弄到了乙份黑暗森林的藏寶圖,於是,探險隊一行人便踏上了尋寶之旅,去尋找傳說中的寶藏。
藏寶點分布在黑暗森林的各處,每個點有乙個值,表示藏寶的價值。它們之間由一些小路相連,小路不會形成環,即兩個寶藏點之間有且只有一條通路。探險隊從其中的一點出發,每次他們可以留乙個人在此點開採寶藏,也可以不留,然後其餘的人可以分成若干隊向這一點相鄰的點走去。需要注意的是,如果他們把隊伍分成兩隊或兩隊以上,就必須留乙個人在當前點,提供聯絡和通訊,當然這個人也可以一邊開採此地的寶藏。並且,為了節約時間,隊伍在前往開採寶藏的過程中是不會走回頭路的。現在你作為隊長的助理,已經提供了這幅藏寶圖,請你算出探險隊所能開採的最大寶藏的價值。
第一行有兩個正整數n(1<=n<=100),表示藏寶點的個數,m(1<=m=100)表示探險隊的人數。
第二行是n個不超過100的正整數,分別表示1到n每個點的寶藏價值。
接下來的n-1行,每行兩個數,x和y(1<=x,y<=n,x<>y),表示藏寶點x,y之間有一條路,資料保證不會有重複的路出現。
假設一開始探險隊在點1處。
乙個整數,表示探險隊所能獲得最大的寶藏價值。
5 3
1 3 7 2 8
1 2
2 3
1 4
4 5還是樹形dp
設f[i][j][0..1]為第i個節點的子樹,放了j個人,i之前是否選擇過的最大價值。
轉移還是非常easy的!
#include
#include
#include
#include
using
namespace
std;
const
int maxn=100077;
vector
a[maxn];
int n,m,b[maxn],ass=0,ans=0,f[maxn][2],c[maxn];
void dfs(int u,int fa)
}int main()
for(int i=1; i<=m-1; i++)
// memset(d,0,sizeof(d));
dfs(n+1,0);
printf("%d",min(f[n+1][0],f[n+1][1]));
}
JZOJ B組 逃離迷宮
description ryz被困在了乙個n m四連通網格圖的迷宮中,每走一步需要消耗一定的體力,消耗的體力等於格仔的高度差的平方。在迷宮的某一些格仔上有體力藥水,可以恢復ryz一定的體力。現在ryz希望消耗最少的體力值到達迷宮出口,請你計算出這個最小的體力值。你可以認為ryz一開始有足夠多的體力。...
JZOJ B組 幸運數
description 如果乙個正整數的所有質因子都小於等於m且每種質因子個數都為奇數,則稱這個數為幸運數,例如當m 3時,6是幸運數而5不是,12也不是幸運數 2這個質因子有偶數個 給定n,m,求小於等於n的幸運數有多少個。input 一行2個數,表示n,m。output 一行1個數,表示幸運數的...
JZOJ B組 體育場
觀眾席每一行構成乙個圓形,每個圓形由300個座位組成,對300個座位按照順時針編號1到300,且可以認為有無數多行。現在比賽的組織者希望觀眾進入場地的順序可以更加的有趣,在門票上並沒有規定每個人的座位,而是與這個圈中某個人的相對位置,可以坐在任意一行。門票上標示的形式如下 a b x 表示第b個人必...