寻找最大子序列和问题
#include<stdio.h>
#define max(a,b) (a)>(b)?(a):(b)
#define MAX 8
int array[MAX] = {3, -2, 5, -3, 4, 7, -6, 9};
int FindDivideRule(int left, int right){
if(left == right)
return array[left];
int mid = (left+right)/2;
int leftmaxsum = FindDivideRule(left,mid);
int rightmaxsum = FindDivideRule(mid+1,right);
int sum = 0;
int mid_left_max_sum;
mid_left_max_sum = array[mid];
for(int i=mid;i>=0;i--){
sum += array[i];
if(sum > mid_left_max_sum)
mid_left_max_sum = sum;
}
sum = 0;
int mid_right_max_sum = array[mid+1];
for(int i=mid+1;i<=right;i++){
sum += array[i];
if(sum > mid_right_max_sum)
mid_right_max_sum = sum;
}
int maybemax = max(leftmaxsum, rightmaxsum);
return max(maybemax,mid_left_max_sum+mid_right_max_sum);
}
int FindDynamic(){
int sum = 0;
int ans;
ans = array[0];
for(int i=0;i<MAX;i++){
if(sum > 0){
sum += array[i];
}
else{
sum = array[i];
}
ans = max(sum,ans);
}
return ans;
}
int main(){
printf("序列:");
for(int i=0;i<MAX;i++)
printf("%d ",array[i]);
printf("的最大子序列和为:\n");
printf("分治法:");
printf("%d\n",FindDivideRule(0, MAX-1));
printf("动态规划:");
printf("%d\n",FindDynamic());
}