洛谷P1352沒有上司的舞會 樹形二維DP

2022-05-01 15:09:19 字數 1689 閱讀 8254

傳送門

題意:上司和直接下屬,不能同時去乙個聚會,問可邀請到的人的快樂值最大是多少;

參考:思路:首先我們們分析一下這道題,對於每乙個人,它所做的決定對上司和下屬都有影響,我們可以只看一方,也就是上司對下屬的影響,因為這樣的影響是相互的。

狀態如果為f[i]表示第i個人的位置能獲得最大的幸福行嗎?

由於我們的選擇具有後效性,因為你去或不去對下屬有影響,那顯然不行。遇到這種情況我們該怎麼辦?

由於後效性實質上是我們對於狀態的性質不夠清楚,所以我們再加一維以實現就算你加還是不加我們都可以記錄下來。所以狀態其實是很好想的。想出狀態後,容易推出方程為

dp[i][0]+=sum(max(dp[son][1],dp[son][0]));  //顯然,你不去,那下屬就可以想去就去。

由此我們就可以愉快的dfs了。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lson (l , mid , rt << 1)

#define rson (mid + 1 , r , rt << 1 | 1)

#define debug(x) cerr << #x << " = " << x << "\n";

#define pb push_back

#define pq priority_queue

#define pll pair#define pii pair#define fi first

#define se second

#define okc ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)

#define ft(a,b,c) for(int a=b;a <= c;++a) //

用來壓行

typedef

long

long

ll;typedef unsigned

long

long

ull;

/*-----------------show time----------------

*/const

int maxn = 6009

;vector

mp[maxn];

intn;

int hp[maxn],dp[maxn][2

],fa[maxn];

void dfs(int u,int

o) dp[u][

1] +=hp[u];

}int

main()

int s =n;

while(s!=fa[s])

dfs(s,-1

); printf(

"%d\n

",max(dp[s][1],dp[s][0

]));

return0;

}

dfs參考中還提到,如果人數過多,或者是一條鏈的時候,可以用bfs+佇列,拓撲排序優化。我感覺主要思路,就是把從子節點到父節點的路徑找出來

洛谷 P1352 沒有上司的舞會

洛谷 p1352 沒有上司的舞會 某大學有n個職員,編號為1 n。他們之間有從屬關係,也就是說他們的關係就像一棵以校長為根的樹,父結點就是子結點的直接上司。現在有個周年慶宴會,宴會每邀請來乙個職員都會增加一定的快樂指數ri,但是呢,如果某個職員的上司來參加舞會了,那麼這個職員就無論如何也不肯來參加舞...

洛谷 P1352 沒有上司的舞會

原題 這道題我非常神奇賴皮的用了拓撲,實際上這是一道樹形dp,但是身為蒟蒻的我覺得拓撲可以寫,結果真的讓我水過了,哈哈哈 用乙個二維陣列模擬每個人參加或者不參加,從最底層的員工開始向上拓撲 by acer.mo include include includeusing namespace std i...

洛谷p1352 沒有上司的舞會

題目已經說了這是一棵樹,而這道題顯然不是重心或者lca之類的東西,所以我們考慮樹形dp。一句廢話 首先考慮如果節點i不去舞會時以i為根的子樹的快樂指數最大值,顯然就是每個以i的兒子為根的子樹的最大值之和。如果節點i參加舞會,那麼相應的最大值就是i的每個兒子都不去時,以i的兒子為根的最大值之和,再加上...