题目链接。
分析:
状态转移方程 d[i][j] = max(d[i-1][j], d[i+1][j], d[i][j-1], d[i][j+1])。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <queue> #include <algorithm> #include <cmath> using namespace std; const int maxn = 100+10; int a[maxn][maxn], d[maxn][maxn], n, m; int dx[] = {0, 0, -1, 1}; int dy[] = {-1, 1, 0, 0}; int dfs(int x, int y) { if(d[x][y] > 0) return d[x][y]; int ans = 0; int nx, ny; for(int i=0; i<4; i++) { nx = x+dx[i]; ny = y+dy[i]; if(nx >= 0 && nx < n && ny >= 0 && ny < m && a[x][y] > a[nx][ny]) { ans = max(ans, dfs(nx, ny)); } } return d[x][y] = ans+1; } int main() { // freopen("my.txt", "r", stdin); while(scanf("%d%d", &n, &m) == 2) { for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { scanf("%d", &a[i][j]); } } memset(d, -1, sizeof(d)); int ans = -1; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(d[i][j] == -1) ans = max(ans, dfs(i, j)); } } printf("%d ", ans); } return 0; }