由于题目没有说明起点和终点,所以我们要对终点或起点遍历每一个位置,
空间换时间,用dp数组记录已经搜索过的结果。
代码如下:
#include <cstdio> #include <cstring> #define N 105 char name[30]; int m, n, d[N][N], a[N][N], dirx[4] = {-1, 1, 0, 0}, diry[4] = {0 , 0,-1, 1}; int dp(int x, int y) { int &ans = d[x][y]; if(ans>0) return ans; ans = 1; for(int i = 0; i < 4; i++) { int nx = x+dirx[i], ny = y+diry[i]; if(nx>=0&&nx<m&&ny>=0&&ny<n&&a[nx][ny]<a[x][y]) ans = ans>dp(nx,ny)+1?ans:dp(nx,ny)+1; } return ans; } int main () { int cas; scanf("%d",&cas); while(cas--) { scanf("%s %d %d",name, &m, &n); for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) scanf("%d",&a[i][j]); memset(d,0,sizeof(d)); int ans = 0; for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) { int t = dp(i,j); ans = ans>t?ans:t; } printf("%s: %d\n",name,ans); } return 0; }