x王國有n位**,編號從1到n。國王是1號**。除了國王以外,每個**都有乙個上司。我們稱這個**是這個上司的下屬。上司的編號總比下屬小。
我們定義乙個**的影響力為他所有下屬的影響力之和再加1。例如,乙個沒有下屬的**的影響力是1。國王的影響力總是n。
任何一位有下屬的**總是選擇他的下屬中影響力最高的作為他的心腹(有若干下屬影響力相同的話則會選擇編號最小的)。
一位**得到一條訊息後,他就要把訊息傳達給國王。我們定義一位**的花費為他將訊息傳達給國王的花費。國王自己的花費為0。如果一位**是他上司的心腹,則他的花費等於他上司的花費,否則他的花費為他上司的花費加1。
由於時代和平,訊息並不需要傳遞的太快。我們希望你決定每位**(除了國王)的上司,使得所有**的花費之和盡量大。
n<=8000
solution:
設f (i
)f(i)
f(i)
為n =i
n=in=
i時的答案,現在來考慮遞推這個答案
設d p[
i][j
]dp[i][j]
dp[i][
j]表示,j
jj個點的森林,森林中每棵樹大小均不大於i
ii,森林中所有點的深度和的最大值(此處定義樹的根節點的深度為111)
若我們已經有了f(i
)f(i)
f(i)
和所有dp[
k][j
],
k<
idp[k][j],kdp
[k][
j],k
<
i,則這就是乙個每種物品數量不限的揹包,轉移可得dp[
i][j
]dp[i][j]
dp[i][
j]遞推f (i
)f(i)
f(i)
時,列舉心腹子樹大小j,j
<
ij,jj,
j<
i,由於其他兒子的子樹大小都不能大於j
jj,因此遞推公式:
f (i
)=ma
x(f(
j)+d
p[j]
[i−1
−j])
,j
<
if(i)=max(f(j)+dp[j][i-1-j]),jf(
i)=m
ax(f
(j)+
dp[j
][i−
1−j]
),j<
i做完了,複雜度o(n
2)
o(n^2)
o(n2
)現場只有15人ac,有那麼難嗎,**不到20行
**:
#include#includeusing namespace std;
int i,j,n,dp[8005][8005],f[8005];
int main()
printf("%d\n",f[n]);
return 0;
}
牛客國慶集訓派對Day1
a 看樣例過題 include include include include include using namespace std typedef long long ll typedef pairpii const int maxn 1e5 10 vectorg maxn int a 10 i...
牛客國慶集訓派對Day4
a 把b n include include include includeusing namespace std int main d 由於是個完全圖,選擇乙個權值最小的點,其他所有的點向它連線就行了。注意點為1的時候輸出0 include include include includeusing...
牛客國慶集訓派對Day2
題意 給出最大4096 64和64 4096的矩陣,其中有乙個矩陣只含有0和1,問你它們相乘所得到得矩陣所有元素異或 思路 一開始我想到的是能不能將01矩陣的一排都用二進位制表示,但是發現2的64次方大於4096,反而增大了複雜度,於是沒有做出這題,題解是將矩陣分塊,最多分成8塊,這樣01矩陣的種數...