算法导论第4章习题解析

来源:互联网 发布:ps软件培训班 编辑:程序博客网 时间:2024/05/20 18:49

4.1-1 当A的所有元素均为负数,FIND-MAXMUM-SUBARRAY返回的是A中第一个最大值。

4.1-2 代码如下:

#include<limits.h>void Find_Maxmum_Violence(int A[],int low,int high,int *r){    int _left = -1;    int _right = -1;       int _max = INT_MIN;    int _length = high - low + 1;    for(int i = 0;i < _length;i++)    {              int sum = A[i];        int max = INT_MIN;        int maxIndex = i;        for(int j = i+1;j < _length;j++)        {           sum+=A[j];           if(sum > max)           {               max = sum;               maxIndex = j;           }        }        if(max > _max)        {            _left = i;            _right = maxIndex;            _max = max;                    }    }     r[0] = _left;    r[1] = _right;    r[2] = _max; }int main(){    int A[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};    int result[] = {-1,-1,INT_MIN};    Find_Maxmum_Violence(A,0,15,result);}

4.1-3:略

4.1-4:修改后的代码如下:

#include<stdio.h>#include<stdlib.h>#include<limits.h>void Find_Max_Crossing_Subarray(int A[],int low,int mid,int high,int *r){    static int result[3];    int left_sum = 0;    int right_sum = 0;    int max_left = -1;    int max_right = -1;    int sum = 0;    for(int i = mid;i>=low;i--)    {        sum+=A[i];        if(sum > left_sum)        {            left_sum = sum;            max_left = i;        }    }    sum = 0;    for(int j = mid+1;j<=high;j++)    {        sum+=A[j];        if(sum > right_sum)        {            right_sum = sum;            max_right = j;        }    }    r[0] = max_left;    r[1] = max_right;    r[2] = left_sum+right_sum;}void Find_Maxmum_Subarray(int A[],int low,int high,int *r){    int result_left[3];    int result_right[3];    int result_mid[3];    if(high == low)    {        r[0] = low;        r[1] = high;        r[2] = A[low];    }    else    {        int mid = (low+high)/2;        Find_Maxmum_Subarray(A,low,mid,result_left);        Find_Maxmum_Subarray(A,mid+1,high,result_right);        Find_Max_Crossing_Subarray(A,low,mid,high,result_mid);        if(result_left[2] >= result_right[2] && result_left[2] >= result_mid[2])        {            r[0] = result_left[0];            r[1] = result_left[1];            r[2] = result_left[2];        }        else if(result_right[2] >= result_left[2] && result_right[2] >= result_mid[2])        {            r[0] = result_right[0];            r[1] = result_right[1];            r[2] = result_right[2];        }                   else        {            r[0] = result_mid[0];            r[1] = result_mid[1];            r[2] = result_mid[2];        }               }}int main(){    int result[3];    int A[] = {-13,-3,-25,-20,-3,-16,-23,-18,-20,-7,-12,-5,-22,-15,-4,-7};    Find_Maxmum_Subarray(A,0,15,result);}

4.1-5

void Find_Maxmum_Subarry_Linear(int A[],int low,int high,int *r){    int left = low;    int right = low;    int sum = A[low];    int maxsum = A[low];    for(int i = low + 1; i <= high; i++)    {        sum+=A[i];        if(sum > maxsum)        {            maxsum = sum;            right = i;        }        else        {            if(sum < 0 && A[i] > 0)            {                left = i;                right = i;                maxsum = A[i];                sum = A[i];            }                  }    }    r[0] = left;    r[1] = right;    r[2] = maxsum;}int main(){    int result[3];    int A[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};    Find_Maxmum_Subarry_Linear(A,0,15,result);}
原创粉丝点击