注意可以且m次,即分成m+1段。所以先讓m加上1。
先做乙個簡單的二分答案算出最小的最大值。然後可以得到乙個o(mn^2)的dp。
發現dp可以通過字首和把時間複雜度優化為o(nm),通過滾掉記錄m的那一維,把空間複雜度優化為o(n)。
#include
#define left leftt
using
namespace std;
const
int n=
5e4+
5,mod=
10007
;int n,m,l,r,mid,ans,ans2,now;
int a[n]
,aa[n]
,left[n]
,f[n]
,sum[n]
;inline
bool
jay(
int mid)
return
true;}
intmain()
now=1;
for(
register
int i=
1; i<=n;
++i)
now=0;
for(
register
int i=
1; i<=n;
++i)
sum[0]
=0;for
(register
int i=
1; i<=n;
++i) sum[i]
=(sum[i-1]
+f[i]
)%mod;
ans2=f[n]
;for
(register
int j=
2; j<=m;
++j)
printf
("%d %d\n"
,ans,ans2)
;return0;
}
bzoj1044 HAOI2008 木棍分割
傳送門 第一問隨便二分就過了,此處略去。第二問dp f i j 前i根木棍,砍了j刀的方案數。轉移方程很顯然,此處略去。我們可以滾掉一維。但是轉移要o n 2m 顯然要t 於是我們可以用單調佇列 字首和優化轉移,使得時間複雜度降為o nm 然後就過了。include include include ...
BZOJ 1044 HAOI2008 木棍分割
bzoj 1044 haoi2008 木棍分割 二分答案 dp 有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連 接處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長 度最大的一段長度最小.並...
BZOJ1044 HAOI2008 木棍分割
有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連 接處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長 度最大的一段長度最小.並將結果mod 10007。輸入檔案第一行有2個數n,m.接下來n...