// i j 代表从数组的第i行第j个开始求和 n代表三角形的最大行数 intMaxSum(int i, int j, int n){ if(i == n) return D[i][j]; int x = MaxSum(i + 1, j, n); int y = MaxSum(i + 1, j + 1, n); return max(x, y) + D[i][j]; }
缺点:这个程序的时间复杂度太大了!!!!当三角形高度过大的时候,会超时的!! O(2^n) !!
改进方法,每算出一个maxsum就保存起来,下次直接取值。不需要再访问。$O(n^2)$
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// 记忆递归形程序 int D[MAX][MAX]; int maxsum[MAX][MAX]; // 初始化为 -1 int n;
intMaxSum(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] = x + y + D[i][j]; } return maxsum[i]][j]; }