2018.09.01 独立集(树形dp)
生活随笔
收集整理的這篇文章主要介紹了
2018.09.01 独立集(树形dp)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
描述
給定一顆樹(邊權為1),選取一個節點子集,使得該集合中任意兩個節點之間的距離都大于K。求這個集合節點最多是多少
輸入
第一行是兩個整數N,K
接下來是N-1行,每行2個整數x,y,表示x與y有一條邊
輸出
1個整數表示最多的節點數
樣例輸入
3 1
1 2
1 3
樣例輸出
2
提示
| 1 | 15 | 1 | |
| 2 | 1000 | 1 | 鏈 |
| 3 | 1000 | 1 | |
| 4 | 100000 | 1 | 鏈 |
| 5 | 100000 | 1 | |
| 6 | 15 | 2 | |
| 7 | 1000 | 2 | 鏈 |
| 8 | 1000 | 2 | |
| 9 | 100000 | 2 | 鏈 |
| 10 | 100000 | 2 |
樹形dp入門題。
T=2的情況有點意思。
設當前訪問第i個節點。
f[i][0]f[i][0]:i不選但i父親選。
f[i][1]f[i][1]:不選且i父親不選。
f[i][2]f[i][2]:i選。
顯然有:
f[i][2]=1+∑vf[v][0]f[i][2]=1+∑vf[v][0]
以及:
f[i][0]=∑vf[v][1]f[i][0]=∑vf[v][1]
關鍵是f[i][1]f[i][1]
這個東西需要考慮兒子之間是否沖突,因此最優值的產生有兩種可能:
1. 所有兒子都不選。
2. 某一個兒子選,其余不選。
因此有f[i][1]=(∑vf[v][1])+max(0,f[v][2]?f[v][1])f[i][1]=(∑vf[v][1])+max(0,f[v][2]?f[v][1])。
代碼:
轉載于:https://www.cnblogs.com/ldxcaicai/p/9738324.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的2018.09.01 独立集(树形dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDFS数据定时采集demo 简单
- 下一篇: 存储器总述