牛客國慶集訓派對day6F

2021-08-28 18:19:33 字數 1531 閱讀 9318

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矩陣的種數...