初学容易想到的是递归,但这一题递归是致命的(TLE)。
用dp思想可以实现。
把从上往下的找最大值问题转换成从下往上,避免了重复计算。
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
const int N = 100 + 5;
int a[N][N], n;
int max(int a, int b) {
if (a > b) return a;
return b;
}
int main() {
int c;
cin >> c;
while (c--) {
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j <= i; j++)
cin >> a[i][j];
for (int i = n - 2; i >= 0; i--)//这里的两个for是本题关键
for (int j = 0; j <= i; j++)
a[i][j] = a[i][j] + max(a[i + 1][j], a[i + 1][j + 1]);
cout << a[0][0] << endl;
}
int ff;
cin >> ff;
return 0;
}