#include <iostream> #include <climits> using namespace std; #define MAXF 101 #define MAXV 101 int A[MAXF][MAXV]; int f[MAXF][MAXV]; int main() { int F, V; scanf("%d%d", &F, &V); for(int i = 1; i <= F; ++i) for(int j = 1; j <= V; ++j) scanf("%d", &A[i][j]); //initial for(int i = 1; i <= V; ++i)//第0行初始化 f[0][i] = 0; f[0][0] = 0; //斜线初始化 for(int i = 1; i <= F; ++i) f[i][i] = f[i-1][i-1] + A[i][i]; //dp for(int i = 1; i <= F; ++i) for(int j = i+1; j <= V; ++j) f[i][j] = max(f[i][j-1], f[i-1][j-1] + A[i][j]); printf("%d/n", f[F][V]); return 0; } //状态方程:前i朵花,放入前j个花瓶的最大值. /*(但要保证计算i<j) Max[i][j] = max{f[i][j-1], f[i-1][j-1] + A[i][j](i < j)}; DP的关键是找出最优子结构和状态转移方程,并注意限制条件 */