BZOJ 1044 木棍分割(DP)

2021-06-16 21:37:39 字數 2292 閱讀 9283

題意:有n根木棍, 第i根木棍的長度為li,n根木棍依次鏈結在一起, 總共有n-1個連線處. 現在允許你最多砍斷m個連線處, 砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小, 並且輸出有多少種砍的方法使得總長度最大的一段長度最小。

思路:令m=m+1,則等價於分成m段使得m段中最長的最小,這個可以二分貪心得到。下面我們設長度最大的最小值為ans。f[i][j]表示前j根木棍分成i段的方案數,設s[i]表示前i個木棍的長度和,那麼有轉移方程:

bzoj1044木棍分割

第一問二分答案 第二問dp需優化空間和時間 坑了一天 才寫出個坑爹坑爹程式 program hehe const q 10007 var ans,s,min,max,n,m,i,j,k,l,t longint sum,h array 0.50000 of longint d array 0.5000...

bzoj1044 HAOI2008 木棍分割

傳送門 第一問隨便二分就過了,此處略去。第二問dp f i j 前i根木棍,砍了j刀的方案數。轉移方程很顯然,此處略去。我們可以滾掉一維。但是轉移要o n 2m 顯然要t 於是我們可以用單調佇列 字首和優化轉移,使得時間複雜度降為o nm 然後就過了。include include include ...

BZOJ 1044 HAOI2008 木棍分割

注意可以且m次,即分成m 1段。所以先讓m加上1。先做乙個簡單的二分答案算出最小的最大值。然後可以得到乙個o mn 2 的dp。發現dp可以通過字首和把時間複雜度優化為o nm 通過滾掉記錄m的那一維,把空間複雜度優化為o n include define left leftt using name...