数字三角形是最基础的DP问题
数字三角形最好理解的就是从最低层往上走,走到顶时能够达到的最大值。对于每个位置(i, j)可以从(i + 1, j)和( i + 1, j + 1)两个位置到达,易知应当选择其中的大者。
定义状态:d(i,j)为从第i层j列出发到数字三角形最下层能达到的最大值
状态转移方程:d(i,j) = max( d(i + 1, j), d(i + 1, j + 1)) + a[i][j]
边界处理:最底层d(n, i)= a[n][i]
#include <cstdio>
#include <algorithm>
#define maxn 105
using namespace std;
int a[maxn][maxn], d[maxn]; // a数组保存数字三角形, d数组用于保存状态
int main()
{
int n;
scanf( "%d", &n);
for ( int i = 1; i <= n; i++){
for ( int j = 1; j <= i; j++){
scanf( "%d", &a[i][j]);
}
}
for ( int i = 1; i <= n; i++){
d[i] = a[n][i]; // 边界处理,采用逆推
}
for ( int i = n - 1; i >= 1; i--){
for ( int j = 1; j <= i; j++){
d[j] = max( d[j], d[j + 1]) + a[i][j]; // 采用滚动数组,节省空间,但要注意递推顺序
}
}
printf( "%d\n", d[1]);
return 0;
}