題意:這題描述看似很複雜, 其實讀懂後就是乙個相鄰點之間連通問題,水題。
解題思路:首先把相鄰的點連線起來建立一棵樹,dp[i][0]表示不選擇i節點可以得到的最大價值,dp[i][1]表示選擇i節點可以得到的最大價值。狀態方程很簡單,詳見**。
#include#include#include#includeusing namespace std;
const int maxn = 1001;
struct edge
edge[maxn<<1];
struct node
point[maxn];
int n,cnt,pre[maxn],dp[maxn][2]; //dp[i][0]表示不選i節點,dp[i][1]表示選i節點
void addedge(int u,int v)
void dfsdp(int u,int fa)
dp[u][0] = max(dp[u][0],tmp); //考慮u的所有子節點都不選
}int main()
dfsdp(1,0);
printf("%d\n",max(dp[1][0],dp[1][1]));
} return 0;
}
poj 1192 最優連通子集 (樹形dp)
設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 m...
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最優連通子集
最優連通子集 題目的描述太繁瑣了。其實意思簡單,就是給定若干個點,如果兩個點之間的曼哈頓距離小於1,就連邊。然後就構成一顆樹,然後每個點都 有乙個權值,然後選取若干個點,使得權值和最大,並且點與點之前都連通。簡單的樹形dp,dp i 表示以i點為根的子樹並且選取i點時的最大權值。方程就很好寫,dp ...