动态规划2
现在有这样一个问题:数字三角形。由于三角形具有层数的概念,很显然的是对于这道题的一种解法是使用深搜:从上到下,进入每一层,遍历每一条路径然后求出答案,可是值得注意的是,三角形的层数太大了。
现在我们换一个角度来思考,我们从三角形底层向上走。
我们使用数组a[i][j]来保存每一个点上的数组,使用数组f[i][j]来记录从点(i, j)开始走,走到底层所能达到的最大数字和。对于非底层的每一个点f[i][j],它都有两个子节点f[i + 1][j]和f[i + 1][j + 1],我们只需要计算f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + a[i][j],就可以获得从点(i, j)开始走,走到最底层所能达到的最大数字和。事实上,当整个三角形计算完毕后,根据数组f的定义,f[1][1]中所保存的数据就是我们要求的答案。
实现代码如下:
#include <iostream> #include <cstdio> using namespace std; int const MAXN = 1001; int n; int f[MAXN][MAXN]; int max(int x, int y) { return x > y ? x : y; } void calc() { for(int i = n - 1; i >= 1; i--) { for(int j = 1; j <= i; j++) { f[i][j] = max(f[i + 1][j], f[i + 1][j + 1]) + f[i][j]; } } } int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) { for(int j = 1; j <= i; j++) { scanf("%d", &f[i][j]); } } calc(); printf("%d\n", f[1][1]); return 0; }
圆满完成。