給定乙個有 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 個選手要進行網球迴圈賽,要求設計乙個滿足以下要求的比賽日程表:選手號12(1)每個選手必須與其他n-1個選手各賽一次。
(2)每個選手一天只能賽一次。
(3)迴圈賽在n-1天之內結束。
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開始 如果直接用...