某类型的DP问题。
题目概述:
给定一个数字三角,第一行1个第二行2个以此类推,我们要计算出来每一行取一个数(每相邻两个数在三角中的位置必须相邻),然后这样能够得到的最大结果是多少。
算法思想:
题解中全是DP,从最下层往上归纳,但是我没有依照这种方法,我用的是先读取所有数组,然后从上往下改数组的值这样做,也成功了。
BTW,可以用滚动数组优化空间复杂度~
滚动数组这个东西还是找时间看一下吧!
代码部分:
#include <iostream> #include <fstream> #include <queue> using namespace std; ifstream fin("numtri.in"); ofstream fout("numtri.out"); int n; int a[1117][1117]; int main() { fin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { fin >> a[i][j]; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { if (i == 1) continue; if (j == 1) { a[i][j] += a[i - 1][j]; continue; } if (j == i) { a[i][j] += a[i - 1][j - 1]; continue; } a[i][j] += max(a[i - 1][j], a[i - 1][j - 1]); } } int res = 0; for (int i = 1; i <= n; i++) { res = res > a[n][i] ? res : a[n][i]; } fout << res << endl; return 0; }