P1352 沒有上司的舞會

2022-08-13 01:51:08 字數 1197 閱讀 3328

簡化題意:

給你一棵樹,每個結點有權值,父結點參加,子結點都不能參加。求最大權值和。

講義告訴我們這道題用dp做。

本來我想的是用一維狀態,結果發現錯了。。。

也許加一維,問題就能更顯然地解決,這道題資料範圍不大,也說明要加一維了。。。

打出狀態轉移方程

設\(dp[i][0]\)和\(dp[i][1]\)為\(i\)結點不去或去的最大權值和。

如果這個點不去,那麼有:

\[dp[u][0] = \sum(max(dp[v][0], dp[v][1])), (u,v) \in e

\]如果這個點去,就有:

\[dp[u][1] = weight[u] + \sum(dp[v][0]), (u,v) \in e

\]有唯一的根節點為校長,就算不告訴我們也可以\(o(n)\)的找出來,建圖後找到入度為0的點就是了。

最後的答案當然是校長去或不去兩種情況的最大值。

我快讀沒寫負數結果90。。。

**:

#include#includeconst int maxn = 6005, inf = 1e9 + 7;

struct edges

e[maxn];

int head[maxn], tot;

int dp[maxn][2];

bool vis[maxn][2];

int weight[maxn];

int indegree[maxn];

int n, root;

int read()

while(ch >= '0' && ch <= '9')

return s * ans;

}void link(int u, int v)

; head[u] = tot;

}int solve(int u, bool go)

}else

}vis[u][go] = true;

return dp[u][go] = ans;

}int main()

for(int i = 1; i <= n; i++) if(indegree[i] == 1)

printf("%d\n", std::max(solve(root, 0), solve(root, 1)));

return 0;

}

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 ...