题目
- 最大子列和问题:是本次课最后讲到的4种算法的实验题,属于基本要求,一定要做;
- Maximum Subsequence Sum:是2004年浙江大学计算机专业考研复试真题,要求略高,选做。其实也不难,是本次课最后讲到的算法的改造,挑战一下吧~
- 二分查找:配合课后讨论题给出这道函数填空题,学有余力、并且会C语言编程的你可以尝试一下。你只需要提交一个函数,而不用交如main函数之类的其他函数。不会C语言的话,就研究一下课后关于二分法的讨论题吧~
第一题
#include <stdio.h>
#include <stdlib.h>
// O(N^3)
int MaxSubseqSum1(int*, int);
// O(N^2)
int MaxSubseqSum2(int*, int);
// O(N)
int MaxSubseqSum4(int*, int);
// O(N*logN)
int MaxSubseqSum3(int,int,int*);
int CLineLeftRight(int, int, int, int*);
int max3(int, int, int);
int main(){
int N;
int A[100000] = {0};
int MaxSum1=0, MaxSum2=0, MaxSum3=0, MaxSum4=0;
scanf("%d", &N);
for(int i=0; i<N; i++)
scanf("%d", &A[i]);
// MaxSum1 = MaxSubseqSum1(A, N);
// MaxSum2 = MaxSubseqSum2(A, N);
// MaxSum3 = MaxSubseqSum3(0, N-1, A);
MaxSum4 = MaxSubseqSum4(A, N);
printf("%d", MaxSum4);
return 0;
}
int MaxSubseqSum1(int A[], int N){
int ThisSum=0, MaxSum=0;
for(int i=0; i<N; i++){
for(int j=i; j<N; j++){
ThisSum = 0;
for(int k=i; k<=j; k++){
ThisSum += A[k];
}
if(ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
int MaxSubseqSum2(int A[], int N){
int ThisSum=0, MaxSum=0;
for(int i=0; i<N; i++){
ThisSum = 0;
for(int j=i; j<N; j++){
ThisSum += A[j];
if(ThisSum > MaxSum)
MaxSum = ThisSum;
}
}
return MaxSum;
}
int MaxSubseqSum3(int left, int right, int *A)
{
int MaxLeftSum = 0, MaxRightSum = 0, MaxCenter = 0;
if(right == left)
return A[left]>0 ? A[left]:0;
int center = (left+right)/2;
MaxLeftSum = MaxSubseqSum3(left, center, A);
MaxRightSum = MaxSubseqSum3(center+1, right, A);
MaxCenter = CLineLeftRight(center, left,right, A);
return max3(MaxLeftSum, MaxRightSum, MaxCenter);
}
int CLineLeftRight(int center,int left,int right,int *A)
{
int Sum1 = 0, Sum2 = 0;
int MaxSum1 = 0, MaxSum2 = 0;
for(int i=center;i>=left;i--){
Sum1 += A[i];
if(Sum1 > MaxSum1)
MaxSum1 = Sum1;
}
for(int i=center+1;i<=right;i++){
Sum2 += A[i];
if(Sum2 > MaxSum2)
MaxSum2 = Sum2;
}
return MaxSum1+MaxSum2;
}
int max3(int a, int b, int c){
return a>b ? a>c ? a:b: (b>c) ? b:c;
}
int MaxSubseqSum4(int A[], int N){
int ThisSum = 0, MaxSum = 0;
for(int i=0;i<N;i++){
ThisSum += A[i];
if(ThisSum > MaxSum)
MaxSum = ThisSum;
else if(ThisSum<0)
ThisSum = 0;
}
return MaxSum;
}
第二题
#include <stdio.h>
#include <stdlib.h>
// O(N)
int OnLine(int, int*, int*, int*);
int main(){
int N;
int A[10000];
int MaxSum = -1;
int MaxIndexR = 0, MaxIndexL = 0;;
scanf("%d", &N);
for(int i=0; i<N; i++)
scanf("%d", &A[i]);
MaxSum = OnLine(N, A, &MaxIndexL, &MaxIndexR);
if(MaxSum<0)
printf("0 %d %d", A[0], A[N-1]);
else
printf("%d %d %d", MaxSum, A[MaxIndexL], A[MaxIndexR]);
return 0;
}
int OnLine(int N, int *A, int *MaxIndexL, int *MaxIndexR){
int MaxSum = -1, ThisSum = 0;
int IndexL = 0, IndexR = 0;
*MaxIndexL = 0;
*MaxIndexR = 0;
for(int i=0; i<N; i++){
ThisSum += A[i];
IndexR = i;
if(ThisSum > MaxSum){
MaxSum = ThisSum;
*MaxIndexL = IndexL;
*MaxIndexR = IndexR;
}
else if(ThisSum < 0){
ThisSum = 0;
IndexR = i+1;
IndexL = i+1;
}
}
return MaxSum;
}
第三题
Position BinarySearch(List L, ElementType X )
{
int left, right, center;
left = 1;
right = L->Last;
while(left <= right)
{
int center = (left+right)/2;
if(X < L->Data[center])
right = center-1;
else if(X > L->Data[center])
left = center+1;
else
return center;
}
return NotFound;
}
特殊的失败标记 NotFound 在线输出为-10,与测试样例不符。(提交后的测试会将 NotFound 重定义)