ACM 11月19日週日週末訓練心得

2021-08-11 00:25:55 字數 1023 閱讀 7041

這週看了樹形dp的一些部落格,比如一道compuer的題目要去求樹上每個點的最遠距離是多少,這題一直被稱為樹形dp的經典是有它的道理的,因為樹dp就是把dp放到樹上做了,一般是從上到下或從下到上(利用回溯)的移轉狀態而這題很合適的需要兩次dfs。對於(有向),dp[u][0]表示在u的子樹下u的最遠距離是多少dp[u][1]表示在u的子樹(和dp[u][0]不是同一孩子)u的次遠距離是多少dp[u][2]表示通過u的父親能走的最遠距離是多少第一次從下到上,對於(有向),狀態轉移顯然是 dp[u][0] = dp[v][0]+w[i];所以要先算出dp[v][0]才能知道dp[u][0]。故是從下往上。第二次從上往下,其實就是再遍歷一邊圖,把dp[v][2]算出來,顯然:dp[v][2] = max(dp[u][2],dp[v][0]+w[i]==dp[u][0]?dp[u][1]:dp[u][0]) + w[i];要算dp[v][2],要先算dp[u][0],所以從上往下。最後的答案就是 max(dp[u][0],dp[u][2])。

void dfs1(int u,int v) //每個節點子樹下的最大和次大  

else if(temp > dp[u][1])

dp[u][1] = temp;

}

}

void dfs2(int u,int v)

else

dfs2(v,u);

} }

對於hdu1520,給一棵樹,選最多的結點使得選擇的結點不存在直接的父子關係,很容易想到乙個結點有兩個狀態:選或者不選

,所以自然地想到狀態dp[u][0/1]表示u子樹內的最佳答案,u的狀態為選或者不選,初始化自然是葉子結點dp[u][0]=0,dp[u][1]=w[u],轉移則可以考慮依次考慮,u不選的時候:u的兒子可以任意選或者不選,所以dp[u][0]+=max(dp[v][0],dp[v][1]),u選的時候:u的兒子必定不能選,所以dp[u][1]+=dp[v][0]   然後dp[u][1]+=w[u]表示加上u這個點,答案自然就是max(dp[rt][0],dp[rt][1])了。

ACM 11月26日週日週末訓練心得

這週末關於樹形dp的專題已經結束了,需要對這個專題進行一下總結,就我做的這些題進行一下總結。樹形dp就是根據問題的描述,問題裡的東西與樹一樣擁有子節點和父節點的關係,而做一些對於這些資訊的檢索以及尋找一些問題所需要的答案則需要尋找一些狀態變化和轉移。選擇一些對樹形dp印象比較深刻的題目進行思考。a這...

ACM 9月3日週日週末訓練心得

今天老師發了新的專題,是線段樹的,今天就用空餘的時間看了看前輩的部落格,了解了一下線段樹的內容,發現樹狀陣列能解決的問題線段樹基本都能解決,線段樹的用法與樹狀陣列的用法似乎有些相似,但是線段樹能維護一段區間的值,不像樹狀陣列,改變乙個地方的值就會整體更新,線段樹有時候就比樹狀陣列好用了 線段樹需要維...

ACM 10月1日週日週末訓練心得

由於我們讀入該掃瞄線後sum 1 的覆蓋值少了5,但是此時我們看圖知道其實這個矩形的另一條上邊了.所以我們不能用ans sum 1 了,我要執行ans abs last sum 1 其中last是上一輪讀入掃瞄線後sum 1 的值。void pushup int i,int l,int r else...