並不容易看出的模型:在n以內的數字和她們不包括自身的約數和(要求小於這個數本身)構成的森林中找到最長的樹的直徑。
上述模型成立是因為每個數字的約數和(不包括自己,下同)是乙個定值,我們正好根據大小關係建立有向樹來進行dfs,根據樹的直徑求法,就可以得到結果了。
**:
#include
#include
#include
#include
using
namespace std;
const
int n=
50010
,m=n*2;
int e[m]
,idx,ne[m]
,h[n]
;int n,w[m]
,sum[m]
,v[m]
;int ans;
//雖然小->大和大->小都可以轉化,但是不走重複的路,就可建一棵有向樹,然後算通過某個根節點的最大和次大的和
intdfs
(int u)
else
if(d>d2) d2=d;
} ans=
max(ans,d1+d2)
;return d1;
}void
add(
int a,
int b)
intmain()
for(
int i=
1;i<=n;i++)if
(!v[i]
)dfs
(i);
cout
}
數字轉換 樹形DP
如果乙個數x的約數和 不包括它本身,下同 比它本身小,那麼x可以變成它的約數和 如果對於某個y x且y的約數和為x,那麼x也可以變成y。例如,4可以變為3,1可以變為7。限定所有的數字變換在不超過n的正整數範圍內進行,求不斷進行數字變換且沒有重複數字出現的最多變換步數。輸入乙個正整數n 輸出不斷進行...
acwing 1075 數字轉換 (樹形DP)
首先,對於小於n的每個數,我們可以確定它的約數之和 不包括自己 是固定的,就像4的約數之和一定是3,不可能是其他的,那麼我們就可以將2 n的每個數的約數之和求出sum i 對於sum i i 的邊 因為對於每個i,sum i 是唯一確定的 也就是說每個兒子都有唯一乙個父節點,那麼我們最終就會構成森林...
AcWing1075 數字轉換 樹形DP 題解
題目傳送門 如果乙個數 x 的約數之和 y 不包括他本身 比他本身小,那麼 x 可以變成 y,y 也可以變成 x。例如,4 可以變為 3,1 可以變為 7。限定所有數字變換在不超過 n 的正整數範圍內進行,求不斷進行數字變換且不出現重複數字的最多變換步數。輸入格式 輸入乙個正整數 n。輸出格式 輸出...