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 打算事先了解外星人的進攻計畫。現在,攜帶了監聽裝置的 已經秘密潛入了外星人的母艦,準備對外星人的通訊實施監聽。外星人的母艦可以看成...