#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
)
{
return A
> B
? A
> C
? A
: C
: B
> C
? B
: C
;
}
int DivideAndConquer(int List
[], int left
, int right
)
{
int MaxLeftSum
, MaxRightSum
;
int MaxLeftBorderSum
, MaxRightBorderSum
;
int LeftBorderSum
, RightBorderSum
;
int center
, i
;
if (left
== right
) {
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:为什么?
转载请注明原文地址:https://ipadbbs.8miu.com/read-18961.html