蓝桥杯节点选择(java)第一道树形dp分析
藍(lán)橋杯 節(jié)點(diǎn)選擇
問題描述
有一棵 n 個節(jié)點(diǎn)的樹,樹上每個節(jié)點(diǎn)都有一個正整數(shù)權(quán)值。如果一個點(diǎn)被選擇了,那么在樹上和它相鄰的點(diǎn)都不能被選擇。求選出的點(diǎn)的權(quán)值和最大是多少?
輸入格式
第一行包含一個整數(shù) n 。
接下來的一行包含 n 個正整數(shù),第 i 個正整數(shù)代表點(diǎn) i 的權(quán)值。
接下來一共 n-1 行,每行描述樹上的一條邊。
輸出格式
輸出一個整數(shù),代表選出的點(diǎn)的權(quán)值和的最大值。
樣例輸入
5
1 2 3 4 5
1 2
1 3
2 4
2 5
樣例輸出
12
樣例說明
選擇3、4、5號點(diǎn),權(quán)值和為 3 4 5 = 12 。
數(shù)據(jù)規(guī)模與約定
對于20%的數(shù)據(jù), n <= 20。
對于50%的數(shù)據(jù), n <= 1000。
對于100%的數(shù)據(jù), n <= 100000。
權(quán)值均為不超過1000的正整數(shù)。
分析
- 看到藍(lán)橋杯的樹形dp題,剛開始看的很蒙蔽。從來沒做過樹形的dp,剛開始表示很難理解,當(dāng)時主要的疑惑點(diǎn)有一下幾點(diǎn):
1:這個樹怎么解決?這么亂的一棵樹感覺根本無法下手,因為你不知道那個是根節(jié)點(diǎn),那個是子節(jié)點(diǎn)。輸出的結(jié)果又和那個有關(guān)系?
2:樹形怎么dp?以前都是遇到線性區(qū)間的dp,樹形dp,怎么查找連續(xù)點(diǎn),就算找到連續(xù)的點(diǎn)交叉點(diǎn)如何處理? - 看了一些博客和文章之后,有了解到dp處理樹形的特殊手段:
一: 一般來說,樹形dp的每個節(jié)點(diǎn)都有一個選擇性,本題就是該店選擇和不選擇,dp[i][0]表示不選擇,dp[i][1]表示選擇該節(jié)點(diǎn)。
二:對于樹形dp,一般要和搜索結(jié)合(更確切的說是遞歸)結(jié)合,對于樹的劃分層次,一般是選擇一個點(diǎn),然后從這個點(diǎn)進(jìn)行往下搜索 ,他的鄰居都變成他的子節(jié)點(diǎn)。也就是相當(dāng)于從這個根節(jié)點(diǎn)除法,可能有很多分叉。也就是有很多分叉會到根節(jié)點(diǎn)。但是這有和dp有啥關(guān)系呢?dp是從尾到頭還是從頭到尾?
三:對于順序的選擇肯定是從尾部到頂部,因為dp要的是一個整合結(jié)果而不是分散求最值或者其他。那么還有問題就是那么多的跟節(jié)點(diǎn),那么多合的點(diǎn),還有反向路徑不好記錄,記錄的難度和開銷都超級大。如果從尾部推到dp還是有一定難度。
四:我們要先拋開整體看局部這個點(diǎn),對于某個單點(diǎn)來說(如果他是頭節(jié)點(diǎn)),分析到他的結(jié)果,如果取他那么他的兒子們都不能取,那么dp[i][1]=dp[兒子們][0] value[i];如果不取他,那么對于每個兒子來說要給最大的,那么dp[i][0]=max(dp[每個兒子][0],dp[每個兒子][1]);這樣就得到遞推式dp[x][0]=sum(max(dp[num][0],dp[num][1]));dp[x][1]=sum(dp[num][0]) value[i].
五:對于頭節(jié)點(diǎn)(可以任選),滿足④,對于頭節(jié)點(diǎn)的兒子也同樣滿足④,但是唯一不同的是要過濾頭節(jié)點(diǎn)(準(zhǔn)確的說是父節(jié)點(diǎn))。防止死循環(huán)。遞歸搜索的過程是雙向的過程,先去再回,我們可以同過先去構(gòu)造樹并且獲得后面的一些信息,然后根據(jù)后來得到的值進(jìn)行操作當(dāng)前等級的dp。 - 總的來說這個樹形dp就是分析某個點(diǎn)的狀態(tài)方程,通過遞歸搜索進(jìn)行劃分樹。獲得結(jié)果。并且這題只有n-1條路徑,n個點(diǎn),不用考慮去重。
附上代碼:
但是結(jié)果只能過7個,
看了下其他人沒優(yōu)化輸入的只能過5個超時。我用測試數(shù)據(jù)測試了一下原因是棧內(nèi)存溢出。苦逼的Java。。
也可能是因為我比較菜,,想不出好的方法,呵呵,。歡迎大佬踢場。。
總結(jié)
以上是生活随笔為你收集整理的蓝桥杯节点选择(java)第一道树形dp分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯最短路(java过)spfa单源最
- 下一篇: python3模拟登陆人人网(reque