一个高度为N的由正整数组成的三角形,从上走到下,求经过的数字和的最大值。
每次只能走到下一层相邻的数上,例如从第3层的6向下走,只能走到第4层的2或9上。
5
8 4
3 6 9
7 2 9 5
例子中的最优方案是:5 + 8 + 6 + 9 = 28。
int getTowerMax(int* arr, int len, int floor) {
int* dp = new int[len + 1];
memset(dp, 0, sizeof(int) * len);
for (int i = len - floor; i < len; ++i) {
dp[i] = arr[i];
}
//自底向上
for (int i = len - floor - 1, floorLen = floor - 1; i >= 0;
--i, floorLen--) {
if (!floorLen) { //换层
--floor;
floorLen = floor - 1; //以当前层的上层为准
}
dp[i] = arr[i] + max(dp[i + floor], dp[i + floor - 1]);
}
return dp[0];
}