一顆二叉查詢樹,以key
ikey_i
keyi
為建值,以p
ip_i
pi為價值。然後乙個節點的sum
sumsu
m定義為這棵子樹的價值之和。
要求相鄰兩個節點不互質的情況下所有節點的最大sum
sumsu
m值之和。
二叉查詢樹滿足中序遍歷的建值從小到大,所以我們考慮區間dpdp
dp。每次將兩個區間組成的二叉樹合併在一起。
我們預處理出哪些節點可以相鄰
設f 0/
1,i,
jf_
f0/1,i
,j表示作為將作為左邊/右邊的子樹與上將上乙個合併過來(根為i/j
i/ji/
j且沒有另一邊子樹)時的最大價值。
那麼我們可以得出動態轉移方程
f 0,
i,j=
f1,i
,k,+
f0,k
+1,j
(vi−
1,k)
f_=f_,+f_(v_)
f0,i,j
=f1
,i,k
,+f
0,k+
1,j
(vi−
1,k)f1
,i,j
=f1,
i,k,
+f0,
k+1,
j(vk
,j+1
)f_=f_,+f_(v_)
f1,i,j
=f1
,i,k
,+f
0,k+
1,j
(vk,
j+1
)
#include
#include
#include
#define ll long long
using
namespace std;
const ll n=
310;
struct nodea[n]
;ll n,f[2]
[n][n]
,ans,s[n]
;bool v[n]
[n];
bool
cmp(node x,node y)
intmain()
for(ll l=
2;l<=n;l++)}
}if(ans<0)
printf
("-1");
else
printf
("%lld"
,ans)
;}
JZOJ5077 樹的難題
給定一棵 n 個點的無根樹,樹上每一條邊都有顏色。一共 m種顏色,編號從 1 到m。第 i 種顏色權值為ci 對於樹上的一條簡單路徑,路徑上經過的所有邊按照順序組成乙個顏色序列,序列可以劃分成若干個相同顏色段。定義路徑權值為顏色序列上每乙個同顏色段的顏色權值之和。你要計算出邊數在 l r 之內的所有...
jzoj3555 樹的直徑
科學家在觀測一棵大樹,這棵樹在不斷地生長,科學家給這棵樹的每個節點編了號。開始的時候,這棵樹很小只有4個節點,一號點為根,其他三個節點掛在上面。在接下來的m次觀察中,科學家每次都能看見這棵樹從葉子處長出新的兩個節點來。如果當前這棵樹有n個節點,那麼這棵樹的新的兩個節點的編號分別為n 1,n 2。科學...
Jzoj3555 樹的直徑
科學家在觀測一棵大樹,這棵樹在不斷地生長,科學家給這棵樹的每個節點編了號。開始的時候,這棵樹很小只有4個節點,一號點為根,其他三個節點掛在上面。在接下來的m次觀察中,科學家每次都能看見這棵樹從葉子處長出新的兩個節點來。如果當前這棵樹有n個節點,那麼這棵樹的新的兩個節點的編號分別為n 1,n 2。科學...