1. 題目:給定乙個陣列,和乙個值k,陣列分成k段。要求這k段子段和最大值最小。求出這個值。
n n-1
m[n, k] = min }
j=1i=j
n表示陣列長度,k表示陣列分成幾段。初始化條件:
m[1, k] = a0
n-1m[n, 1] =∑ai
i=0很容易發現上述的遞迴演算法擁有指數時間的複雜度,並且會重複計算一些m值。這類的演算法一般可以使用動態規劃進行優化。使用陣列儲存一些已經計算得到
的值,採用從低向上進行計算。這就是演算法2。文章中還給出了第三種很牛的演算法,我是想不到的。這就是使用二分查詢應用到這個題目。大牛真是太牛了!!
下面是**:
1 #include 2 #include 34using
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 輛大巴來機場接這些奶牛。每輛大巴可以乘...