演算法 陣列分段和最大值最小問題

2022-07-05 07:48:13 字數 2328 閱讀 8286

題目:給定乙個陣列,和乙個值k,陣列分成k段。要求這k段子段和最大值最小。求出這個值。

n                             n-1

m[n, k] = min }

j=1                            i=j

n表示陣列長度,k表示陣列分成幾段。初始化條件:

m[1, k] = a0

n-1

m[n, 1] = ∑ ai

i=0

遞迴演算法擁有指數時間的複雜度,並且會重複計算一些m值。這類的演算法一般可以使用動態規劃進行優化。使用陣列儲存一些已經計算得到的值,採用自底向上進行計算

此題可以想象成把資料按順序裝入桶中,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 輛大巴來機場接這些奶牛。每輛大巴可以乘...