Edx 上北大演算法的学习笔记:
eg.1 给一个 0-9的数字组成的阵列,D阵列大小为 第n行的列数为 :n,从第(1,1)个数字开始往下或者往右相加,求加完为止得到的最大和,不要求路径,只看结果。
Solution : 第1-n行,就像一层一层的洋葱。反骨剥洋葱,先深入洋葱内部,再从洋葱最底层开始剥,最后只吐出最表层的皮D(1,1),此时已经算完。
所有可能的路径最后得出的结果个数,等于n。 把最后的结果存在一个数组中,就选择D(1,1)来保存最后的结果。
code:
#include "stdafx.h"
#include <iostream>
#include <algorithm>
using namespace std;
#include "stdafx.h"
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 101
int D[MAX][MAX]; int n;
int maxSum[MAX][MAX];
int MaxSum(int i,int j){
if (maxSum[i][j] != -1)
return maxSum[i][j];
if (i == n) maxSum[i][j] = D[i][j];
else {
int x = MaxSum(i + 1, j);
int y = MaxSum(i + 1, j + 1);
maxSum[i][j] = max(x, y) + D[i][j];
}
return maxSum[i][j]; //反骨剥洋葱,先深入洋葱内部,再从洋葱最底层开始剥,最后只吐出最表层的皮。
}
int main()
{
int i, j;
cin >> n;
for (i = 1; i <= n; i++)
for (j = 1; j <= i; j++)
{
cin >> D[i][j];
maxSum[i][j] = -1;
}
cout << MaxSum(1, 1) << endl;
cin >> n;
}