//状态转移方程 dp[i][j] = max(dp[i-1][j], dp[i][j+1], dp[i+1][j], dp[i][j-1]) + 1; #include <stdio.h> #include <stdlib.h> #include <algorithm> using namespace std; int **matrix; int **length; int R, C; int dp(int i, int j) { if (length[i][j] != 0) { return length[i][j]; } int mmax = 0; if (i-1>=0 && matrix[i][j] > matrix[i-1][j]) //up { mmax = max(mmax, dp(i-1, j)); } if (j+1<=C-1 && matrix[i][j] > matrix[i][j+1]) //right { mmax = max(mmax, dp(i, j+1)); } if (i+1<=R-1 && matrix[i][j] > matrix[i+1][j]) //left { mmax = max(mmax, dp(i+1, j)); } if (j-1>=0 && matrix[i][j] > matrix[i][j-1]) //right { mmax = max(mmax, dp(i, j-1)); } return (length[i][j] = mmax + 1); } int main() { int i, j; scanf("%d %d", &R, &C); matrix = (int**) malloc(sizeof(int*) * R); length = (int**) malloc(sizeof(int*) * R); for (i=0; i<R; i++) { matrix[i] = (int*) malloc(sizeof(int) * C); length[i] = (int*) malloc(sizeof(int) * C); } for (i=0; i<R; i++) { for (j=0; j<C; j++) { scanf("%d", matrix[i] + j); length[i][j] = 0; } } for (i=0; i<R; i++) { for (j=0; j<C; j++) { dp(i, j); } } int mmax = length[0][0]; for (i=0; i<R; i++) { for (j=0; j<C; j++) { if (length[i][j] > mmax) { mmax = length[i][j]; } } } printf("%d/n", mmax); free(matrix); free(length); matrix = NULL; length = NULL; return 0; }