日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【bzoj1044】[HAOI2008]木棍分割 二分+dp

發布時間:2023/12/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【bzoj1044】[HAOI2008]木棍分割 二分+dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

有n根木棍, 第i根木棍的長度為Li,n根木棍依次連結了一起, 總共有n-1個連接處. 現在允許你最多砍斷m個連接處, 砍完后n根木棍被分成了很多段,要求滿足總長度最大的一段長度最小, 并且輸出有多少種砍的方法使得總長度最大的一段長度最小. 并將結果mod 10007。。。

輸入

輸入文件第一行有2個數n,m.接下來n行每行一個正整數Li,表示第i根木棍的長度.n<=50000,0<=m<=min(n-1,1000),1<=Li<=1000.

輸出

輸出有2個數, 第一個數是總長度最大的一段的長度最小值, 第二個數是有多少種砍的方法使得滿足條件.

樣例輸入

3 2
1
1
10

樣例輸出

10 2


題解

二分+dp

第一問即 noip2015跳石頭 。。。一眼二分,然后看不滿足條件時就切一刀,判斷是否小于m。

第二問求方案數,很顯然是個dp。

設$f[i][j]$表示前$i$個分了$j$段的方案數,那么狀態轉移方程應該為$f[i][j]=\sum\limits_{len(t+1,i)\le ans1}f[t][j-1]$,邊界條件$f[0][0]=1$,其中$len(a,b)表示$[a,b]$所有木棍的長度總和。

可以發現$t$的取值范圍是一段連續的單調的區間,因此可以用類似雙指針的方法掃出$t$的取值左端點。然后$\sum$又可以使用前綴和維護,這樣時間復雜度就降為了$O(nm)$。

然而這樣還會炸空間。。。

因此使用滾動數組就好了,顯然第二維是可以滾動的,因此先枚舉第二維,滾動一下就好了。

#include <cstdio> #include <algorithm> #define N 50010 #define mod 10007 using namespace std; int n , m , a[N] , sl[N] , f[2][N] , sum[2][N]; bool judge(int mid) {int i , now = 0 , cnt = 0;for(i = 1 ; i <= n ; i ++ ){if(now + a[i] > mid) now = 0 , cnt ++ ;now += a[i];}return cnt <= m; } int main() {int i , j , l = 0 , r = 0 , mid , ans = -1 , p = 0 , ret = 0 , d;scanf("%d%d" , &n , &m);for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &a[i]) , l = max(l , a[i]) , r += a[i] , sl[i] = sl[i - 1] + a[i];while(l <= r){mid = (l + r) >> 1;if(judge(mid)) ans = mid , r = mid - 1;else l = mid + 1;}printf("%d " , ans);for(i = 0 ; i <= n ; i ++ ) sum[0][i] = 1;for(i = d = 1 ; i <= m + 1 ; i ++ , d ^= 1){sum[d][0] = p = 0;for(j = 1 ; j <= n ; j ++ ){while(sl[j] - sl[p] > ans) p ++ ;f[d][j] = sum[d ^ 1][j - 1];if(p) f[d][j] = (f[d][j] - sum[d ^ 1][p - 1] + mod) % mod;sum[d][j] = (sum[d][j - 1] + f[d][j]) % mod;}ret = (ret + f[d][n]) % mod;}printf("%d\n" , ret);return 0; }

?

?

轉載于:https://www.cnblogs.com/GXZlegend/p/7491510.html

總結

以上是生活随笔為你收集整理的【bzoj1044】[HAOI2008]木棍分割 二分+dp的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。