題解:
第一問二分答案
第二問用f[i][j]表示前i塊分成j段的方案數
但是mle
於是改變列舉順序
先列舉j,然後i這一層用滾動陣列優化
f[i][j]=sigma f[k][j-1](sum[i]-sum[k]<=ans)
決策是一段區間,而且左端點單調,搞個指標維護最左的決策點
#include#include#include#includeusing namespace std;const int maxn=100009;
const int mm=10007;
int n,m;
int s[maxn]=;
int tot=0;
int l=0,r=0,mid=0,ans=0;
int f[maxn]=;
int g[maxn]=;
int isok()
} ++cnt;
if(cnt>m)return 0;
else return 1;
}int main()
r=1000000000;
while(l<=r)else
} printf("%d ",ans);
for(int i=1;i<=n;++i)
for(int j=2;j<=m;++j)
f[i]=tm;
tm=(tm+g[i])%mm;
} tot=(tot+f[n])%mm;
// for(int i=1;i<=n;++i)cout/ cout
printf("%d\n",tot);
return 0;
}
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...
BZOJ 1044 HAOI2008 木棍分割
bzoj 1044 haoi2008 木棍分割 二分答案 dp 有n根木棍,第i根木棍的長度為li,n根木棍依次鏈結了一起,總共有n 1個連線處.現在允許你最多砍斷m個連 接處,砍完後n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小,並且輸出有多少種砍的方法使得總長 度最大的一段長度最小.並...