給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。
最簡單的方法, 但時間複雜度太高
int
findgreatestsumofsubarrayway1
(vector<
int> data)}}
return sum;
}
最常見的方法, **略微複雜
int
dealgreatestsum
(vector<
int>
&array,
int begin,
int end)
int mid =
(begin + end)/2
;int leftmax =
dealgreatestsum
(array, begin, mid)
;int rightmax =
dealgreatestsum
(array, mid +
1, end)
;int crossmax =0;
int i;
int sum =0;
int tmpmax = array[mid]
;for
(i = mid; i >= begin; i--)}
crossmax +
= tmpmax;
sum =0;
tmpmax = array[mid +1]
;for
(i = mid +
1; i <= end; i++)}
crossmax +
= tmpmax;
return
max(
max(leftmax, rightmax)
, crossmax);}
//入口
intfindgreatestsumofsubarrayway2
(vector<
int> array)
最快的方法
int
findgreatestsumofsubarrayway3
(vector<
int> data)
else
if(maxsum < tmp)
}return maxsum;
}
#include
#include
#include
#include
using
namespace std;
intmain()
; vector<
int>
data
(array, array +8)
;// cout << findgreatestsumofsubarrayway1(data);
// cout << findgreatestsumofsubarrayway2(data);
// cout << findgreatestsumofsubarrayway3(data);
system
("pause");
return0;
}
最大子段和之分治遞迴法
time limit 10 ms memory limit 400 kib submit statistic problem description 給定n 1 n 50000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所...
3664 最大子段和之分治遞迴法
time limit 10 ms memory limit 400 kib problem description 給定n 1 n 50000 個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時定義子段和為0,...
最大子段和之分治法
問題描述 給定乙個陣列,找出其中可以構成最大數的子段,需要注意的是,這個不同於最大子串行求和 最大字段求和 字段必須是連續的 最大子串行求和 子串行只要是包含在原來的序列中即可 舉個例子 1 4 3 1 5 1 4 5 2 求上述的陣列中的最大欄位和,不難得知,最大子段和就是 10 也就是子段4 3...