#include<stdio.h>
#define NEGINF -1000000000
#define MAX(a,b) a>b?a:b
int a[9]={-2,1,-3,4,-1,2,1,-5,4};
int max_across(int low,int mid,int high)
{
int i;
int leftsum,rightsum,sum,righti,lefti,maxsum;
leftsum=NEGINF;
sum=0;
for(i=mid;i>=low;i--)
{
sum=sum+a[i];
if(sum>leftsum)
{
leftsum=sum;
lefti=i;
}
}
rightsum=NEGINF;
for(i=mid+1;i<=high;i++)
{
sum=sum+a[i];
if(sum>rightsum)
{
rightsum=sum;
righti=i;
}
}
maxsum=leftsum+rightsum;
return maxsum;
}
int max_sum(int low,int high)
{
int left_sum,right_sum,across_sum,final_sum;
int mid=low+(high-low)/2;
if(low==high) return a[low];
left_sum=max_sum(low,mid);
printf("left_sum = %d, low = %d, high = %d\n",left_sum,low,high);
right_sum=max_sum(mid+1,high);
printf("right_sum = %d, low = %d, high = %d\n",right_sum,low,high);
across_sum=max_across(low,mid,high);
printf("across_sum = %d, low = %d, high = %d\n",across_sum,low,high);
final_sum=MAX(MAX(left_sum,right_sum),across_sum);
printf("final_sum = %d, low = %d, high = %d\n",final_sum,low,high);
return final_sum;
}
int main()
{
int sum;
sum=max_sum(0,9);
printf("sum = %d\n",sum);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2RlZmluZSBORUdJTkYgLTEwMDAwMDAwMDAKI2RlZmluZSBNQVgoYSxiKSBhPmI/YTpiCgppbnQgYVs5XT17LTIsMSwtMyw0LC0xLDIsMSwtNSw0fTsKCmludCBtYXhfYWNyb3NzKGludCBsb3csaW50IG1pZCxpbnQgaGlnaCkKewogICAgaW50IGk7CiAgICBpbnQgbGVmdHN1bSxyaWdodHN1bSxzdW0scmlnaHRpLGxlZnRpLG1heHN1bTsKICAgIGxlZnRzdW09TkVHSU5GOwogICAgc3VtPTA7CiAgICBmb3IoaT1taWQ7aT49bG93O2ktLSkKICAgIHsKICAgICAgICBzdW09c3VtK2FbaV07CiAgICAgICAgaWYoc3VtPmxlZnRzdW0pCiAgICAgICAgewogICAgICAgICAgICBsZWZ0c3VtPXN1bTsKICAgICAgICAgICAgbGVmdGk9aTsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJpZ2h0c3VtPU5FR0lORjsKICAgIGZvcihpPW1pZCsxO2k8PWhpZ2g7aSsrKQogICAgewogICAgICAgIHN1bT1zdW0rYVtpXTsKICAgICAgICBpZihzdW0+cmlnaHRzdW0pCiAgICAgICAgewogICAgICAgICAgICByaWdodHN1bT1zdW07CiAgICAgICAgICAgIHJpZ2h0aT1pOwogICAgICAgIH0KICAgIH0KCiAgICBtYXhzdW09bGVmdHN1bStyaWdodHN1bTsKICAgIHJldHVybiBtYXhzdW07Cn0KIAppbnQgbWF4X3N1bShpbnQgbG93LGludCBoaWdoKQp7CiAgICBpbnQgbGVmdF9zdW0scmlnaHRfc3VtLGFjcm9zc19zdW0sZmluYWxfc3VtOwogICAgaW50IG1pZD1sb3crKGhpZ2gtbG93KS8yOwogICAgaWYobG93PT1oaWdoKSByZXR1cm4gYVtsb3ddOwogICAgbGVmdF9zdW09bWF4X3N1bShsb3csbWlkKTsKICAgIHByaW50ZigibGVmdF9zdW0gPSAlZCwgbG93ID0gJWQsIGhpZ2ggPSAlZFxuIixsZWZ0X3N1bSxsb3csaGlnaCk7CiAgICByaWdodF9zdW09bWF4X3N1bShtaWQrMSxoaWdoKTsKICAgIHByaW50ZigicmlnaHRfc3VtID0gJWQsIGxvdyA9ICVkLCBoaWdoID0gJWRcbiIscmlnaHRfc3VtLGxvdyxoaWdoKTsKICAgIGFjcm9zc19zdW09bWF4X2Fjcm9zcyhsb3csbWlkLGhpZ2gpOwogICAgcHJpbnRmKCJhY3Jvc3Nfc3VtID0gJWQsIGxvdyA9ICVkLCBoaWdoID0gJWRcbiIsYWNyb3NzX3N1bSxsb3csaGlnaCk7CiAgICBmaW5hbF9zdW09TUFYKE1BWChsZWZ0X3N1bSxyaWdodF9zdW0pLGFjcm9zc19zdW0pOwogICAgcHJpbnRmKCJmaW5hbF9zdW0gPSAlZCwgbG93ID0gJWQsIGhpZ2ggPSAlZFxuIixmaW5hbF9zdW0sbG93LGhpZ2gpOwogICAgcmV0dXJuIGZpbmFsX3N1bTsKfQoKaW50IG1haW4oKQp7CiAgICBpbnQgc3VtOwogICAgc3VtPW1heF9zdW0oMCw5KTsKICAgIHByaW50Zigic3VtID0gJWRcbiIsc3VtKTsKICAgIHJldHVybiAwOwp9
left_sum = -2, low = 0, high = 1
right_sum = 1, low = 0, high = 1
across_sum = -3, low = 0, high = 1
final_sum = 1, low = 0, high = 1
left_sum = 1, low = 0, high = 2
right_sum = -3, low = 0, high = 2
across_sum = -3, low = 0, high = 2
final_sum = 1, low = 0, high = 2
left_sum = 1, low = 0, high = 4
left_sum = 4, low = 3, high = 4
right_sum = -1, low = 3, high = 4
across_sum = 7, low = 3, high = 4
final_sum = 4, low = 3, high = 4
right_sum = 4, low = 0, high = 4
across_sum = -2, low = 0, high = 4
final_sum = 4, low = 0, high = 4
left_sum = 4, low = 0, high = 9
left_sum = 2, low = 5, high = 6
right_sum = 1, low = 5, high = 6
across_sum = 5, low = 5, high = 6
final_sum = 2, low = 5, high = 6
left_sum = 2, low = 5, high = 7
right_sum = -5, low = 5, high = 7
across_sum = 1, low = 5, high = 7
final_sum = 2, low = 5, high = 7
left_sum = 2, low = 5, high = 9
left_sum = 4, low = 8, high = 9
right_sum = 0, low = 8, high = 9
across_sum = 8, low = 8, high = 9
final_sum = 4, low = 8, high = 9
right_sum = 4, low = 5, high = 9
across_sum = 0, low = 5, high = 9
final_sum = 4, low = 5, high = 9
right_sum = 4, low = 0, high = 9
across_sum = 5, low = 0, high = 9
final_sum = 5, low = 0, high = 9
sum = 5