分治法解決最大子陣列問題

2021-07-01 20:14:37 字數 2001 閱讀 1201

利用分治法解決最大子陣列問題(對給定的陣列得到該陣列中具有最大和的子陣列)

/*

* 對於給定的整數陣列a,求出陣列中具有最大和的子陣列,最大和以及左右下標

* 思路:採用分治的方法,將陣列分為兩部分,則有最大和的子陣列共有三種情況

* 在陣列左邊,在陣列右邊,跨越陣列中點

*/#include

using namespace std;

//存放左右邊界值以及sum值的結構體

/*特別注意結構體的使用!!!!!!!!!!!*/

struct sumborder

;//找到橫跨中點mid,在陣列a[low..high]之間的最大子陣列的和

sumborder *findmaxcrosssubarray(int *ptra, int low, int mid, int high)

}/*得到mid+1及右邊最大和*/

int rightsum = ptra[mid + 1];

int maxright = mid + 1;

sum = 0;

for (int j = mid + 1; j <= high; j++)

}/*統計彙總*/

sumborder sumborder;

sumborder *ptr = &sumborder;

ptr->left = maxleft;

ptr->right = maxright;

ptr->sum = leftsum + rightsum;

cout << ptr->left << "-"

<< ptr->right << " sum:"

<< ptr->sum

<< endl;

return ptr;

}/*得到陣列a(從low到high)的最大子陣列和*/

sumborder *findmaxsubarray(int *ptra, int low, int high)

else

else

if (right->sum >= left->sum && right->sum >= cross->sum)

else

}cout << sumborderptr->left << "-"

<< sumborderptr->right

<< " 最大值為:"

<< sumborderptr->sum

<< endl;

return sumborderptr;

}int main()

; sumborder sumborder;

sumborder *ptr = &sumborder;

sumborder *test = findmaxsubarray(a, 1, 16); //吃過大虧!

ptr->left = test->left;

ptr->right = test->right;

ptr->sum = test->sum;

/* 把上面的替換成這樣是錯誤的,仔細學習一下struct結構體!!

sumborder *ptr = findmaxsubarray(a, 1, 16);

cout << "left:" << ptr->left << endl;

cout << "right:" << ptr->right << endl;

cout << "sum:" << ptr->sum << endl;

*/cout << "陣列a的最大子陣列和為:"

<< endl;

cout << "left:"

<< ptr->left << endl;

cout << "right:"

<< ptr->right << endl;

cout << "sum:"

<< ptr->sum

<< endl;

system("pause >> cout");

return

0;}

分治法解決最大子陣列問題

演算法導論中一道很有趣的演算法入門題目,問題是解決最大子陣列的問題,給你乙個陣列,要求你求出其中和最大的連續子陣列,最簡單的思考方式就是暴力求解,對所有的情況都進行組合然後得出最大值,但是這個複雜度是n 為了減少複雜度,演算法導論提供了一種思路,就是用分治法解決最大子陣列的問題 我們首先將要求的陣列...

分治法解決最大子陣列問題

問題 輸入乙個整形陣列 有正數也有負數 陣列中連續的 乙個或多個元素組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。輸入 測試陣列1,2,3,10,4,7,2,5 輸出 最大子陣列為3,10,4,7,2 輸出最大子陣列的和為18 總體思路 蠻力法是最簡單的實現方法,只要列出陣列所有可...

分治法解決最大子陣列問題

問題 輸入乙個整形陣列 有正數也有負數 陣列中連續的 乙個或多個元素組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。輸入 測試陣列1,2,3,10,4,7,2,5 輸出 最大子陣列為3,10,4,7,2 輸出最大子陣列的和為18 總體思路 蠻力法是最簡單的實現方法,只要列出陣列所有可...