某大學有n個職員,編號為1~n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數ri,但是呢,如果某個職員的直接上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計計算,邀請哪些職員可以使快樂指數最大,求最大的快樂指數。
第一行乙個整數n。(1<=n<=6000)
接下來n行,第i+1行表示i號職員的快樂指數ri。(-128<=ri<=127)
接下來n-1行,每行輸入一對整數l,k。表示k是l的直接上司。
最後一行輸入0 0
輸出最大的快樂指數。
輸入 #1複製
7111111
11 3
2 36 4
7 44 5
3 50 0
輸出 #1複製
5思路:樹形dp入門題
#include#include#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;typedef unsigned
long
long
ull;
#define sc1(a) scanf("%lld",&a)
#define pf1(a) printf("%lld\n",a)
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
const ll inf=1e18;
const ull base=2333
;const
int maxn=6e3+50
;const
int maxm=1e2+50
;const
int maxv=1e6+5
;const
int mod=1e9+7
;const
int ba=3e5;
ll a[maxn];
vector
v[maxn];
bool
is_root[maxn];
ll dp[maxn][
5];//
dp[i][0]表示職員i不來 dp[i][1]表示職員i來的最大值
void
dfs(ll x)
//兒子全部都算完了
//考慮本身來或者不來
///如果本身不來的話 當前節點的值等於所以兒子來或者不來的最大值之和
for(int i=0;i)
///本身來的話 兒子一定不能來
for(int i=0;i)
dp[x][
1]+=a[x];//
加上本身的值
}int
main()
for(int i=1;i)
ll e1,e2;sc1(e1);sc1(e2);
for(int i=1;i<=n;i++)//
找到根 }
return0;
}/***/
P1352 沒有上司的舞會
原題鏈結 樹形dp入門 dp方程搞錯了居然還過了90 利用dfs遞迴求解 每個點分為選和不選兩種情況 假設選為1不選為0 dp x 0 max dp num i 1 dp num i 0 這裡一開始寫成了dp num i 1 但它的兒子的兩種狀態實際上都是可選的 dp x 1 dp num i 0 ...
P1352 沒有上司的舞會
題目描述 某大學有n個職員,編號為1 n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數ri,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞會了。所以,請你程式設計...
P1352 沒有上司的舞會
題目 p1352 沒有上司的舞會 演算法標籤 dp,搜尋,樹形結構,記憶化搜尋 從樹的頭往下求結果會有後效性,且有多個葉子節點,資料不易處理 則採用,葉子節點往頭部求結果 對於某一節點,有選擇和不選擇兩種情況 1 不選擇的話 記 dp 0 for int i 0 i a x tail.size i ...