題目:給定乙個陣列,和乙個值k,陣列分成k段。要求這k段子段和最大值最小。求出這個值。
n n-1
m[n, k] = min }
j=1 i=j
n表示陣列長度,k表示陣列分成幾段。初始化條件:
m[1, k] = a0
n-1遞迴演算法擁有指數時間的複雜度,並且會重複計算一些m值。這類的演算法一般可以使用動態規劃進行優化。使用陣列儲存一些已經計算得到的值,採用自底向上進行計算m[n, 1] = ∑ ai
i=0
此題可以想象成把資料按順序裝入桶中,m即是給定的桶數,問桶的容量至少應該為多少才能恰好把這些數裝入k個桶中(按順序裝的)。
首先我們可以知道,桶的容量最少不會小於陣列中的最大值,即桶容量的最小值(小於的話,這個數沒法裝進任何桶中),假設只需要乙個桶,那麼其容量應該是陣列所有元素的和,即桶容量的最大值;其次,桶數量越多,需要的桶的容量就可以越少,即隨著桶容量的增加,需要的桶的數量非遞增的(二分查詢就是利用這點);我們要求的就是在給定的桶數量m的時候,找最小的桶容量就可以把所有的數依次裝入k個桶中。在二分查詢的過程中,對於當前的桶容量,我們可以計算出需要的最少桶數requiredpainters,如果需要的桶數量大於給定的桶數量k,說明桶容量太小了,只需在後面找對應的最小容量使需要的桶數恰好等於k;如果計算需要的桶數量小於等於k,說明桶容量可能大了(也可能正好是要找的最小桶容量),不管怎樣,該桶容量之後的桶容量肯定不用考慮了(肯定大於最小桶容量),這樣再次縮小查詢的範圍,繼續迴圈直到終止,終止時,當前的桶容量既是最小的桶容量。
對於陣列 1 2 3 4 5 6 7,假設k=3,最小桶容量為7(要5個桶),最大桶容量為28(乙個桶)
第一行表示桶容量,第二行表示需要的桶數,即要求桶數量恰為k的最小桶容量
#include #include#include
#include
#include
#include
"solution.h
"using
namespace
std;
//***************====方案1*************************=
//遞迴的暴力搜素演算法 , 指數時間的複雜度
int partition(vector nums, int len, int
k) //
***************===方案二********************==
//改進的動態規劃演算法
//時間複雜度:o(kn2) 空間複雜度:o(kn)
int dp_findmax(vector nums, int
k)
for (int i = 1; i <= nums.size(); i++)
dp[i][
1] =sums[i];
for (int i = 1; i <= k; i++)
dp[1][i] = nums[0
];
for (int i = 2; i <= k; i++)
dp[j][i] =best;}}
return
dp[nums.size()][k];
}int getrequiredpainters(vector nums, int
mid)
}return
numpainters;}//
********************====方案三********************====
//二分查詢演算法
//時間複雜度:o(n log ( ∑ ai )). 空間複雜度:0(1)
int binarysearch(vector nums, int
k)
int lo = max_val; //
陣列中最大元素
int hi = accumulate(nums.begin(), nums.end(), 0); //
陣列求和
while (lo < hi)
return
lo;}
intmain() ;
vector
va(a, a+5
);
int k = 3
; cout
cout
cout
return0;
}
陣列分段和最大值最小問題
參考博文 原始問題 假設有m個房間,清潔每個房間耗時用乙個陣列表示,10 20 30 40 50 60 70 80 90,安排n個清潔工,將連續的房間分成n份,每部分耗時求和,其最大值為此種分法的總耗時。求最快的耗時是多少。例如3個清潔工的話,10 20 30 40 50 60 70 80 90,此...
陣列分段和最大值最小問題
1.題目 給定乙個陣列,和乙個值k,陣列分成k段。要求這k段子段和最大值最小。求出這個值。n n 1 m n,k min j 1i j n表示陣列長度,k表示陣列分成幾段。初始化條件 m 1,k a0 n 1 m n,1 ai i 0很容易發現上述的遞迴演算法擁有指數時間的複雜度,並且會重複計算一些...
二分最大值最小問題
一場別開生面的牛吃草大會就要在farmer john的農場舉辦了!世界各地的奶牛將會到達當地的機場,前來參會並且吃草。具體地說,有n頭奶牛到達了機場 1 n 105 其中奶牛i在時間ti 0 ti 109 到達。farmer john安排了m 1 m 10 5 輛大巴來機場接這些奶牛。每輛大巴可以乘...