■.問題描述:
對於任意乙個給定的整數串(a1,a2, ... ,an),找到該整數串的最大子串和(特殊情況:如果陣列中所有元素均為負數,則規定其最大子串和為0.)。
■.example:
整數串為: 8 -11 4 6 -3 7 -5 2 -1 3
最大子串和為14(紅色標記部分的和)。
■.實現思想:
●.遞迴實現
●.將整個整數串分解為左右兩個部分,那麼最大子串和只可能出現在以下三個地方:
●.整個串的左半部分,可通過遞迴方法求左半子串最大和;
●.整個串的右半部分,可通過遞迴方法求右半子串最大和;
●.兩個半串中間部分,首先要找到包含左半部分最後乙個元素的左半部分最大和以及
包含右半部分第乙個元素的右半部分最大和,然後將兩個最大和相加得到整個串的最大和;
■.**實現(c++):
■.測試**:#include using namespace std;
//求三個元素中的最大值元素//求三個元素中的最大值元素
template type max(type x, type y, type z)
if(z > maxtype)
return maxtype;
}//求解最大子串和的遞迴函式
template type maxsumrec(type *array, int left, int right)
type center = (left + right) / 2;
//左半部分的遞迴呼叫
type maxleftsum = maxsumrec(array, left, center);
//右半部分的遞迴呼叫
type maxrightsum = maxsumrec(array, center + 1, right);
//求包含左半部分最後乙個元素的左半部分最大和
type maxleftbordersum = 0, leftbordersum = 0;
for(int i = center; i >= left; i--)
}//求包含右半部分第乙個元素的右半部分最大和
type maxrightbordersum = 0, rightbordersum = 0;
for(int j = center + 1; j <= right; j++)
}//返回左半子串,右半子串,和中間子串中的最大值即為所求
return max(maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum);
}
template type max(type x, type y, type z)
if(z > maxtype)
return maxtype;
}//求解最大子串和的遞迴函式
template type maxsumrec(type *array, int left, int right)
type center = (left + right) / 2;
//左半部分的遞迴呼叫
type maxleftsum = maxsumrec(array, left, center);
//右半部分的遞迴呼叫
type maxrightsum = maxsumrec(array, center + 1, right);
//求包含左半部分最後乙個元素的左半部分最大和
type maxleftbordersum = 0, leftbordersum = 0;
for(int i = center; i >= left; i--)
}//求包含右半部分第乙個元素的右半部分最大和
type maxrightbordersum = 0, rightbordersum = 0;
for(int j = center + 1; j <= right; j++)
}//返回左半子串,右半子串,和中間子串中的最大值即為所求
return max(maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum);
}
int main()
; cout<<"maxsubsum is : "
cout<<"maxsubsum is : "
}
求最大子串行和(Java實現)
問題描述 最大子串行和問題 給定整數a1,a2,an 可能有負數 ak的最大值 為方便起見,如果所有整數均為負數,則最大子串行和為0 通過四種方式來完成演算法的實現,時間複雜度分別為 o n n n o n n o n log n o n 原始碼1 package cn.edu.nwsuaf.cie...
分治法求最大子串
最近在學分治法,涉及到很多問題都能用分治法解決,漢諾塔,快排,歸併排序等,下面是解決最大字串問題。1,用分治法解決,下面還介紹不用分治解決的另一種方法。include 分治法 int countstring int a,int start,int end void main int v counts...
求最大子串行和
include using namespace std int maxseqsum const int a,int n o n 2 return s2 int maxseqsum2 const int a,int n o n else if s1 0 return s2 int maxseqsum3...