HOJ 2084 数塔

初学容易想到的是递归,但这一题递归是致命的(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;
}

猜你喜欢

转载自blog.csdn.net/qq_44724908/article/details/104054412
今日推荐