陣列分段和最大值最小問題

2021-09-27 12:53:10 字數 1991 閱讀 8501

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很容易發現上述的遞迴演算法擁有指數時間的複雜度,並且會重複計算一些m值。這類的演算法一般可以使用動態規劃進行優化。使用陣列儲存一些已經計算得到

的值,採用從低向上進行計算。這就是演算法2。文章中還給出了第三種很牛的演算法,我是想不到的。這就是使用二分查詢應用到這個題目。大牛真是太牛了!!

下面是**:

1 #include 2 #include 3

4using

namespace

std;

5int sum(int a, int

from, int

to)

11//

遞迴的暴力搜素演算法

12//

指數時間的複雜度

13int partition(int a, int n, int

k) 25

26//

改進的動態規劃演算法

27//

時間複雜度:o(kn2)

28//

空間複雜度:o(kn)

29const

int max_n = 100

; 30

int findmax(int a, int n, int

k) ;

32int cum[max_n+1] = ;

33for (int i = 1; i <= n; i++)

34 cum[i] = cum[i-1] + a[i-1

]; 35

36for (int i = 1; i <= n; i++)

37 m[i][1] =cum[i];

38for (int i = 1; i <= k; i++)

39 m[1][i] = a[0

]; 40

41for (int i = 2; i <= k; i++)

47 m[j][i] =best;

48}

49}

50return

m[n][k]; 51}

5253

54int getmax(int a, int

n)

59return

max;

60}

6162

int getsum(int a, int

n)

6869

int getrequiredpainters(int a, int n, int

maxlengthperpainter)

77}

78return

numpainters;

79}

8081

82//

想不到的二分查詢演算法

83//

時間複雜度:o(n log ( ∑ ai )).

84//

空間複雜度:0(1)

85int binarysearch(int a, int n, int

k)

97return

lo; 98}

99int

main()

100;

102int k=3

;103

int a[length]=;

104 cout

105 cout

106 cout

107return0;

108 }

陣列分段和最大值最小問題

參考博文 原始問題 假設有m個房間,清潔每個房間耗時用乙個陣列表示,10 20 30 40 50 60 70 80 90,安排n個清潔工,將連續的房間分成n份,每部分耗時求和,其最大值為此種分法的總耗時。求最快的耗時是多少。例如3個清潔工的話,10 20 30 40 50 60 70 80 90,此...

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

題目 給定乙個陣列,和乙個值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值。這類的演算法...

二分最大值最小問題

一場別開生面的牛吃草大會就要在farmer john的農場舉辦了!世界各地的奶牛將會到達當地的機場,前來參會並且吃草。具體地說,有n頭奶牛到達了機場 1 n 105 其中奶牛i在時間ti 0 ti 109 到達。farmer john安排了m 1 m 10 5 輛大巴來機場接這些奶牛。每輛大巴可以乘...