設d[x]表示從結點x出發,走向以x為根的子樹,能夠到達的最短距離,設x的子結點y1,
y2..
.y
ty_1,y_2...y_t
y1,y2
...
yt,則有
d [x
]=ma
x(di
+edg
e(x,
yi))
i=1,
2,..
.t
d[x] = max ( d_i + edge(x, y_i) ) i = 1,2,...t
d[x]=m
ax(d
i+e
dge(
x,yi
))i
=1,2
,...
t定義f[x]為經過x的最長鏈的長度,對於x的任意兩個結點yi,
yj
y_i,y_j
yi,yj
,f[x]由四部分構成,從y
iy_i
yi到y
iy_i
yi子樹的最遠距離,邊(x,
yi
)(x, y_i)
(x,yi
),邊(x,
yj
)(x, y_j)
(x,yj
),yj
y_jyj
到yj
y_jyj
子樹的最遠距離。
voiddp(
int x)
}
新增鏈結描述
此處給出的是每個結點的權值,並不是每條邊的權值,但是求法與求樹的直徑差不多
#include
using
namespace std;
typedef
long
long ll;
const ll n =
1e5+5;
vector vec[n]
;ll n, a[n]
, dp[n]
, ans =
-1e9
;void
dfs(ll x, ll fa)
ans =
max(ans, dp[x]);
}int
main()
dfs(1,
0); cout << ans << endl;
return0;
}
最長子序列
最長子序列可以說是剛接觸動態規劃的人經常遇見也不得不解決的問題,最常見的有兩種,一種是最長公共子串行 lcs 還有乙個是最長上公升子串行 lis 今天我就總結下這兩個的做法。一 最長公共子串行 lcs 題目描述 給你兩個陣列,可以是數字的,也可以是字串,我們假設是數字的!舉個例子 x 1,5,6,4...
最長子序列
在做oj題目的時候,經常會用到字串的處理。例如,比較二個字串相似度。這篇文章介紹一下求兩個字串的最長公共子串行。乙個字串的子串行,是指從該字串中去掉任意多個字元後剩下的字元在不改變順序的情況下組成的新字串。最長公共子串行,是指多個字串可具有的長度最大的公共的子串行。include includech...
最長子序列
題 給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為8的陣列a,則其最長的單調遞增子串行為,長度為6。思路1 第一眼看到題目,很多人肯定第一時間想到的是lcs。先給陣列排個序形成新陣列,然後再把新陣列和原陣列拿來求lcs,即可得到答案。這種解法很...