遞迴實現求最大子串和

2021-08-02 04:06:59 字數 2339 閱讀 7826

■.問題描述:

對於任意乙個給定的整數串(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...