樹形DP 高階題

2021-08-22 15:12:40 字數 2216 閱讀 9902

emmmm我之前那篇部落格都是一些普及提高的樹形dp水題,基本都是乙個模板能夠解決的問題。現在讓我們來高階一下。

**傳送門

有乙個樹形結構,每條邊的長度相同,任意兩個節點可以相互到達。選3個點。兩兩距離相等。有多少種方案?

難度:省選+/noi-

這道題的難度並不是不能接受,一開始會覺得很難但是仔細想過之後會發現其實還好。

首先,我們要求任意三個點互相到達的距離相等,同時它是乙個樹形結構

所以,仔細想一下可以得知,如果要讓三個點互相距離相同,那麼只會有一種方案,也就是,乙個中心店,即他們到這個中心點距離相同,然後它們之間互相的距離也是一樣的。

如果一時不能理解的話,請想過後再往下看。

那麼,這個這個中心點就成為了我們做這道題的入手。

我們可以列舉這個樹形結構的每乙個點作為根,那麼,在我們每次列舉出的這棵樹里,每一層的節點是不是就是高度相同?

也就是,這些點每三個就可以作為乙個方案,

然後我們的任務就是來求方案了

根據小學乘法原理,

譬如這個根有三個子樹,在這一層 的節點數分別是a,b,c,那麼方案數是不是就是a*b*c?

同理如果這個根再多乙個子樹那麼方案數是不是還要多 a∗

b∗d+

a∗c∗

d+b∗

c∗d a∗b

∗d+a

∗c∗d

+b∗c

∗d

即(a∗b+a

∗c+b

∗c)∗

d (a∗

b+a∗

c+b∗

c)∗d

那麼再多一顆子樹也依然如此。

所以這就是我們的突破口了,

用乙個sum2陣列維護a*b+b*c+a*c………等這一式子;每次新得到的節點數為k

那麼新增加的答案數為sum2*k;

設sum1為當前這一層當前子樹之前的所有節點之和,

設tot[i]為當前子樹第i層的節點數

那麼框架就是

1.列舉根節點k

2.列舉每一棵子樹,計算第i層的tot[i];

3.計算部分:an

s=an

s+to

t[i]

∗sum

2[i]

; ans

=ans

+tot

[i]∗

sum2

[i];

sum2[i]

=sum

2[i]

+sum

1[i]

∗tot

[i] sum

2[i]

=sum

2[i]

+sum

1[i]

∗tot

[i

]sum

1[i]

=sum

1[i]

+tot

[i] sum

1[i]

=sum

1[i]

+tot

[i

]tot

[i]=

0//清

零∗∗ tot

[i]=

0//清

零∗

∗然後就是每次列舉樹根之後,sum1sum2要清零。

**:#include

using

namespace

std;

const

int maxn=5010;

int n,m,cnt,head[maxn],sum1[maxn],sum2[maxn],dep,tot[maxn];

long

long ans;

inline

int read()

while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();

return w?-x:x;

}struct node

e[maxn<<1];

void add(int u,int v)

void getfun(int v,int u,int deep)

}int main()

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

cout

《大佬解法好

感謝大佬

高數題 (樹形DP?)

問題描述 姐最近生了個漂亮寶寶休假在家,聽lee姐介紹經驗時發覺lee姐比高中反應遲鈍了些,一問才知lee姐是因為連生了兩兒子才這樣的,lee姐的體會是一孕笨三年,姐聽了覺得閒著也是閒著,得找些挑戰的事情做做,於是 姐最近開始刷起了高數題,她遇到了這樣一道高數題。這道高數題裡面有一棵n個點的樹,樹上...

樹形dp 沒有上司的舞會 模板題 樹形dp

樹形dp思維門檻高,但是跨過門檻之後,思維難度卻不高。這點非常類似於 關鍵是要體會採用二進位制數來表示狀態的思想,要轉變傳統思維,學習接收並吸收這種思想。285.沒有上司的舞會 簡單模擬樣例,便於理解 樣例的高興度都是 1,那就是挑選沒有相鄰邊的盡量多的點 樹形dp思路 重點 狀壓dp 思路 狀態轉...

樹形dp高階題2 JSOI2018潛入行動

題目描述 外星人又雙叒叕要攻打地球了,外星母艦已經向地球航行!這一次,jyy 已經聯絡好了 艦隊,打算聯合所有 jsoier 抵禦外星人的進攻。在 艦隊就位之前,jyy 打算事先了解外星人的進攻計畫。現在,攜帶了監聽裝置的 已經秘密潛入了外星人的母艦,準備對外星人的通訊實施監聽。外星人的母艦可以看成...