【bzoj4987】Tree【树形dp】
生活随笔
收集整理的這篇文章主要介紹了
【bzoj4987】Tree【树形dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
正解:樹形dp
思維能力不行,不看題解什么都想不出來= =
首先有一個很顯然的結論,選出的k個點一定是連成一片的。
我們要做的就是選出順次經過k個點的一條路徑(邊可以重合),所以我們可以把選點轉化為選邊。
我們讓f[i][j][k=0/1/2]f[i][j][k=0/1/2]表示ii的子樹內選了jj條邊,包含了kk個路徑端點的最小代價。
f[i][j][0]f[i][j][0]代表從ii到子樹內的某個節點,再回到ii的最小代價。
f[i][j][1]f[i][j][1]代表從ii子樹內的某個節點到ii的最小代價。
f[i][j][2]f[i][j][2]代表從ii子樹內的某個節點到ii,再到ii子樹內的另一個節點的最小代價。
我們枚舉uu的每一個兒子vv,用vv的ff數組更新uu的ff數組。
用f[v][j][0/2]f[v][j][0/2]更新f[u]f[u]時,u?>vu?>v這條邊的代價算兩次。
用f[v][j][1]f[v][j][1]更新f[u]f[u]時,u?>vu?>v這條邊的代價只用算一次。、
由定義很容易理解。
邊界:f[u][0][0]=f[u][0][1]=f[u][0][2]=0f[u][0][0]=f[u][0][1]=f[u][0][2]=0。其他初始化為infinf。
代碼
總結
以上是生活随笔為你收集整理的【bzoj4987】Tree【树形dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成为优秀程序员应该具备的8个特质
- 下一篇: 机器学习算法总结--GBDT