就是一个数塔,可以用一维数组节省空间。
状态转移方程:dp[i][j] = a[i][j] + max( dp[i+1][j], dp[i+1][j+1])
#include <iostream> #include <cstdio> using namespace std; #define M 355 short a[M][M]; int dp[M], n; inline int max(short a, short b) { return a > b ? a : b; } int DP() { int i, j; for (i = 0; i < n; i++) dp[i] = a[n-1][i]; for (i = n - 2; i >= 0; i--) { for (j = 0; j <= i; j++) dp[j] = a[i][j] + max(dp[j], dp[j+1]); } return dp[0]; } int main() { while (scanf ("%d", &n) != EOF) { for (int i = 0; i < n; i++) { for (int j = 0; j <= i; j++) scanf ("%hd", &a[i][j]); } printf ("%d\n", DP()); } return 0; }