acwing 1075 數字轉換 (樹形DP)

2021-10-21 23:46:05 字數 1151 閱讀 1043

首先,對於小於n的每個數,我們可以確定它的約數之和(不包括自己)是固定的,就像4的約數之和一定是3,不可能是其他的,那麼我們就可以將2-n的每個數的約數之和求出sum[i],對於sum[i]i 的邊(因為對於每個i,sum[i]是唯一確定的),也就是說每個兒子都有唯一乙個父節點,那麼我們最終就會構成森林(多課樹),題中找最長的變換步驟就轉換成了求樹的最長直徑

為什麼不從1開始 ,因為1除本身外約數之和就是0,題中要求最小為1,所以1是不符合要求的

如何找一樹的最長直徑,我們可以依次列舉每個點,找這個點最長和次長距離,然後相加即可 ,具體可看樹的最長路徑,這裡就不詳細講解了

#include

#include

#include

#include

#include

using

namespace std;

const

int n =

5e4+10;

int n;

int h[n]

, e[n]

, ne[n]

, idx;

int sum[n]

;//約數之和

bool is[n]

;//是否已經用過

int ans;

void

add(

int a,

int b)

intdfs

(int u)

ans =

max(ans, d1 + d2)

;return d1;

}int

main()

}for

(int i =

2; i <= n; i++

) is[i]

=true;}

for(

int i =

1; i <= n; i++)}

cout << ans << endl;

return0;

}

AcWing 1075 數字轉換

題目描述 如果乙個數 x 的約數之和 y 不包括他本身 比他本身小,那麼 x 可以變成 y,y 也可以變成 x。例如,4 可以變為 3,1可以變為 7。限定所有數字變換在不超過 n 的正整數範圍內進行,求不斷進行數字變換且不出現重複數字的最多變換步數。輸入格式 輸入乙個正整數 n。輸出格式 輸出不斷...

ACWing 1075 數字轉換

如果乙個數x xx的約數之和y yy 不包括他本身 比他本身小,那麼x xx可以變成y yy,y yy也可以變成x xx。例如,4 44可以變為3 33,1 11可以變為7 77。限定所有數字變換在不超過n nn的正整數範圍內進行,求不斷進行數字變換且不出現重複數字的最多變換步數。輸入格式 輸入乙個...

AcWing1075 數字轉換 樹形DP 題解

題目傳送門 如果乙個數 x 的約數之和 y 不包括他本身 比他本身小,那麼 x 可以變成 y,y 也可以變成 x。例如,4 可以變為 3,1 可以變為 7。限定所有數字變換在不超過 n 的正整數範圍內進行,求不斷進行數字變換且不出現重複數字的最多變換步數。輸入格式 輸入乙個正整數 n。輸出格式 輸出...