分治法解最大子串行和 迴圈日程安排問題

2021-10-06 08:06:54 字數 2367 閱讀 5989

給定乙個有 n (n≥1) 個整數的序列,要求求出其中最大連續子串行的和。

例如:

規定乙個序列最大連續子串行和至少是0 (長度為0的子串行),如果小於0,其結果為0。

若 n>1,採用分治法求解最大連續子串行時,取其中間位置 mid=(n-

1)/2, 該子串行只可能出現3個地方。

#include 

using namespace std;

intmax3

(int a,

int b,

int c)

;int

maxsubsum

(int a,

int low,

int high)

;int

main()

; cout <<

maxsubsum

(a,0,4

);return0;

}int

max3

(int a,

int b,

int c)

intmaxsubsum

(int a,

int low,

int high)

for(

int i = mid +

1; i <= high; i++

)int marginmaxsum = leftmarginsum + rightmarginsum;

return

max3

(leftmaxsum, rightmaxsum, marginmaxsum)

;}

marginmaxsum = leftmarginsum + rightmarginsum

求 " 整個部分 " 的子串行最大和應該算是關鍵了。

設有 n = 2k 個選手要進行網球迴圈賽,要求設計乙個滿足以下要求的比賽日程表:

(1)每個選手必須與其他n-1個選手各賽一次。

(2)每個選手一天只能賽一次。

(3)迴圈賽在n-1天之內結束。

選手號12

21* k = 2 計畫表

選手號123

4214

3341

2432

1 從上面可以了解到,日程表可以看作是乙個 2

k * 2

k 的表:

1、k = 1 時的日程表是 k = 2 時日程表的左上部分,k = 2 時的日程表是 k = 3 時日程表的左上部分,····,k = n - 1 是的日程表是 k = n 時的日程表的左上部分

2、每個日程表的左上部分與右下部份相同,左下部分與右上部份相同

3、左上部分與左下部分對應位置的值相差 2k-1

基於這些特點,給出分治策略:

將 n=2k 問題劃分為4部分:

(1)、左上角:左上角為 2k-1 個選手在前半程的比賽日程 ( k=1 時 直接給出,否則,上一輪求出的就是 2k-1 個選手的比賽日程 )。

(2)、左下角:左下角為另 2k-1 個選手在前半程的比賽日程,由左上角加 2k-1 得到,例如22個選手比賽,左下角由左上角直接加2 (2k-1)得到,23個選手比賽,左下角由左上角直接加4 (2k-1) 得到。

(3)、右上角:將左下角直接複製到右上角得到另 2k-1 個選手在後半程的比賽日程。

(4)、右下角:將左上角直接複製到右下角得到 2k-1 個選手在後半程的比賽日程。

#include 

using namespace std;

#define max 100

int n;

//比賽人數

int a[max]

[max]

;//存放比賽日程表(行列下標為0的元素不用

// k 為2的冪數

void

plan

(int k)

//右上角

for(

int r =

1; r <= temp; r++

)//右下角

for(

int r = temp +

1; r <= n; r++

) t++;}

}int

main()

return0;

}

理解右上角元素的求法可能有些難度。

最大子串行和(分治求法)

這已經是一道家喻戶曉的題了,給出乙個陣列,裡面是一串數字,求出子串行中和最大的,輸出這個和。思路 這道題有很多經典解法,其中最典型應該是動態規劃,而我們今天要討論的是用二分法怎麼求解這道題。include using namespace std int aleng int f int a,int b...

最大子段和之分治法

問題描述 給定乙個陣列,找出其中可以構成最大數的子段,需要注意的是,這個不同於最大子串行求和 最大字段求和 字段必須是連續的 最大子串行求和 子串行只要是包含在原來的序列中即可 舉個例子 1 4 3 1 5 1 4 5 2 求上述的陣列中的最大欄位和,不難得知,最大子段和就是 10 也就是子段4 3...

分治法(2) 最大子段和

題目 給定n個元素的整數列 可能為負整數 a1,a2,an.求形如 ai,ai 1,aj i j 1 n,i j 的子段使其和為最大。當所有整數為負整數時定義其最大欄位和為0。例如當 a1,a2,a3,a4,a5,a6 2,11,1,13,5,2 最大欄位和為i 2,j 4 下標從1開始 如果直接用...