利用分治法解決最大子陣列問題(對給定的陣列得到該陣列中具有最大和的子陣列)
/*
* 對於給定的整數陣列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 總體思路 蠻力法是最簡單的實現方法,只要列出陣列所有可...