浙江大学数据结构-陈越 编程题1

题目

  1. 最大子列和问题:是本次课最后讲到的4种算法的实验题,属于基本要求,一定要做;
  2. Maximum Subsequence Sum:是2004年浙江大学计算机专业考研复试真题,要求略高,选做。其实也不难,是本次课最后讲到的算法的改造,挑战一下吧~
  3. 二分查找:配合课后讨论题给出这道函数填空题,学有余力、并且会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 重定义)

参考

浙江大学MOOC数据结构-陈越、何钦铭 编程练习题(第一讲)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值