常規的思路是應用分治法 找出每一層最大的項 統一相加獲得最大路徑
此處使用動態規劃的方法。算法
class MaxSum { //數字三角形 //此處使用初始化的數組 避免手動初始化的麻煩 //此處僅作演示,若是用做其餘用途可改寫 int numbers[5][5] = { {2}, {6,9}, {9,5,6}, {9,8,1,9}, {4,5,2,6,5} }; int mstb[5]; //max_sum_to_bottom,某一層到達底邊最大的和,mstb[0]表示第一層到達底邊最大和 public: //找出數組最大元素 int getMaxNumber(int* const &numbers) { int max = 0; int length = sizeof(numbers); for (int i = 0; i < length;i++) { if (max < numbers[i]) { max = numbers[i]; } } return max; } //輸出三角形 void print() { for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (numbers[i][j] > 0) { cout << numbers[i][j] << ends; //undo: 沒有對0以及負數作考慮 } } cout << endl; } } //獲取從頂至底最大和 int getMaxSum() { mstb[4] = getMaxNumber(numbers[5]); for (int i = 3; i >= 0; i--) { mstb[i] = mstb[i + 1] + getMaxNumber(numbers[i]); } return mstb[0]; } };
class Problem1Tester{ public: MaxSum max_sum; void getMaxNumber_Test() { max_sum.print(); int numbers[5] = {8,5,9,5,1}; cout << max_sum.getMaxNumber(numbers) << endl; } void getMaxSum_Test() { max_sum.print(); cout << max_sum.getMaxSum() << endl; } }tester1;
參考:
http://blog.csdn.net/baidu_28312631/article/details/47418773數組