Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 1

Link: https://oj.vnoi.

info/problem/ptree

SOLUTION:
Ta gọi dp[i][j] là với đỉnh i và đã tạo chọn được đồ thị P’ có j thành phần
liên thông tổng là bao nhiêu
Khi đó ta khởi tạo dp[u][1] = c[u]
Khi đó ta dp duyệt tính từng số số lượng số đã tạo thành đồ thị : i
Với mỗi giá trị i đang xét đến sẽ được thạo thành bởi việc ghép từ 2 con
j (j < i) là giá trị lớn nhất với đỉnh u và cộng với 1 đỉnh v nào đấy có cạnh
nối chung với v mang giá trị là k sao cho k + j = i hay k = i - j
Ta sẽ có dp[u][i] tức xét đến đỉnh u và có i nhóm đỉnh liên thông đang
có tổng trọng số là lớn nhất sẽ được tính bằng tổng của dp[u][j] (với j là
các cạnh ) và dp[v][i – j] (chính là đỉnh còn lại mang giá trị k )
Thực hiện dfs như trên ta sẽ thu được các giá trị

Tiếp đó ta sẽ thử các đỉnh n và tìm ra max của dp[các đỉnh][p] tương
ứng lưu lại đỉnh i là đỉnh mà dp[i][p] max để cho việc truy vết

Quay lại phần thực hiện quy hoạch động ở trên với mỗi lần cập nhật lại
dp[u][i] ta sẽ lưu lại trace[v][i] = k = i – j

Thực hiện truy vết ta sẽ xét các đỉnh từ 1 đến n ta sẽ gọi lại hàm truy vết
với đỉnh lại từ u và số k và cập nhật lại x -= trace[v][x]

You might also like