poj 1192 最優連通子集 (樹形dp)

2021-06-29 10:22:08 字數 708 閱讀 7273

設dp[u][0]為以u為根的子樹,子集中沒有u的最大權值,dp[u][1]則表示子集中有u。

如果子集中沒有u,那麼u的所有兒子中只能選乙個。

如果子集中有u,那麼u的所有兒子要麼不選,要麼必須在子集中。

狀態轉移方程

dp[u][0]=max(dp[u][0],max(dp[v][0],dp[v][1]));

dp[u][1]+=max(0,dp[v][1]);

v是u的兒子節點

#include

#include

#include

#include

#include

#define n 1005

using

namespace

std;

struct point

p[n];

int dp[n][2];

bool adj(point a,point b)

vector

edge[n];

int vis[n],ct;

void dfs(int u)

ct--;

}int main()}}

int ans=0;

for(i=1;i<=n;i++)

}printf("%d\n",ans);

return

0;}

POJ 1192最優連通子集

最優連通子集 題目的描述太繁瑣了。其實意思簡單,就是給定若干個點,如果兩個點之間的曼哈頓距離小於1,就連邊。然後就構成一顆樹,然後每個點都 有乙個權值,然後選取若干個點,使得權值和最大,並且點與點之前都連通。簡單的樹形dp,dp i 表示以i點為根的子樹並且選取i點時的最大權值。方程就很好寫,dp ...

POJ 1192 最優連通子集 詳解樹形DP

題目描述 color blue size medium b align center 最優連通子集 align b size color color blue b description b color 眾所周知,我們可以通過直角座標系把平面上的任何乙個點p用乙個有序數對 x,y 來唯一表示,如果x...

POJ 1192 最優連通子集 動態規劃

題意 簡單點說就是給定一棵樹,每個節點都有乙個權值,現在要求求出這棵樹的乙個聯通的一枝使其權值最大。解法 設sum i 為包含i節點在內的一枝的最大權值和,那麼sum i val i max 0,sum j 其中 i,j 之間存在邊。當sum j 為負數時,對父親節點的貢獻就為0了。如下 inclu...