簡化題意:
給你一棵樹,每個結點有權值,父結點參加,子結點都不能參加。求最大權值和。
講義告訴我們這道題用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 ...