#include<iostream>
#include<time.h>
using namespace std;
#define MAXSIZE 100
clock_t start, stop;
double duration;
int MaxSubseqSum1(int a[], int N) {
int ThisSum, MaxSum = 0;
int i, j, k;
for (i = 0; i < N; i++) {
for (j = i; j < N; j++) {
ThisSum = 0;
for (k = i; k <= j; k++)
ThisSum += a[k];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
int MaxSubseqSum2(int a[], int N) {
//
int ThisSum, MaxSum = 0;
int i, j;
for (i = 0; i < N; i++) {
ThisSum = 0;
for (j = i; j < N; j++) {
ThisSum += a[j];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
int Max3(int A, int B, int C)
{
/* 返回3个整数中的最大值 */
return A > B ? A > C ? A : C : B > C ? B : C;
}
int DivideAndConquer(int List[], int left, int right)
{
/* 分治法求List[left]到List[right]的最大子列和 */
int MaxLeftSum, MaxRightSum; /* 存放左右子问题的解 */
int MaxLeftBorderSum, MaxRightBorderSum; /*存放跨分界线的结果*/
int LeftBorderSum, RightBorderSum;
int center, i;
if (left == right) {
/* 递归的终止条件,子列只有1个数字 */
if (List[left] > 0) return List[left];
else return 0;
}
/* 下面是"分"的过程 */
center = (left + right) / 2; /* 找到中分点 */
/* 递归求得两边子列的最大和 */
MaxLeftSum = DivideAndConquer(List, left, center);
MaxRightSum = DivideAndConquer(List, center + 1, right);
/* 下面求跨分界线的最大子列和 */
MaxLeftBorderSum = 0; LeftBorderSum = 0;
for (i = center; i >= left; i--) {
/* 从中线向左扫描 */
LeftBorderSum += List[i];
if (LeftBorderSum > MaxLeftBorderSum)
MaxLeftBorderSum = LeftBorderSum;
} /* 左边扫描结束 */
MaxRightBorderSum = 0; RightBorderSum = 0;
for (i = center + 1; i <= right; i++) {
/* 从中线向右扫描 */
RightBorderSum += List[i];
if (RightBorderSum > MaxRightBorderSum)
MaxRightBorderSum = RightBorderSum;
} /* 右边扫描结束 */
/* 下面返回"治"的结果 */
return Max3(MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum);
}
int MaxSubseqSum3(int a[], int N) {
return DivideAndConquer(a, 0, N - 1);
}
int MaxSubseqSum4(int a[], int N) {
int ThisSum, MaxSum;
int i;
ThisSum = MaxSum = 0;
for (i = 0; i < N; i++) {
ThisSum += a[i];
if (ThisSum > MaxSum)
MaxSum = ThisSum;
else if (ThisSum < 0)
ThisSum = 0;
}
return MaxSum;
}
int main() {
int n, a[MAXSIZE], i, s = 100000;
cout << "input the length of your subsequence:";
cin >> n;
cout << "input your subsequence:";
for (i = 0; i < n; i++)
cin >> a[i];
start = clock();
for (i = 0; i < s; i++)
MaxSubseqSum1(a, n);
stop = clock();
duration = ((double)(stop - start)) / CLK_TCK;
cout << "first program:" << duration << endl;
start = clock();
for (i = 0; i < s; i++)
MaxSubseqSum2(a, n);
stop = clock();
duration = ((double)(stop - start)) / CLK_TCK;
cout << "second program:" << duration << endl;
start = clock();
for (i = 0; i < s; i++)
MaxSubseqSum3(a, n);
stop = clock();
duration = ((double)(stop - start)) / CLK_TCK;
cout << "third program:" << duration << endl;
start = clock();
for (i = 0; i < s; i++)
MaxSubseqSum4(a, n);
stop = clock();
duration = ((double)(stop - start)) / CLK_TCK;
cout << "forth program:" << duration << endl;
}
世界未解之谜,为什么代码运行出来的结果
算法三的分而治之怎么回事???
而在PTA提交的结果很对啊
算法2:
算法3:
算法4:为什么?