注意2种方法的差别,递归的使用 #include<iostream> using namespace std; int r,c; int xd[101][101]; int len[101][101]; //上下左右 int pos[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; bool ok(int i,int j){ if(1 <= i && i <= r && 1 <= j && j <= c) return true; return false; } int dp(int i,int j){ if(len[i][j] > 0) return len[i][j]; /* int up,down,left,right,maxUD,maxLR,max; up = down = left = right = 0; if(i - 1 >= 1 && xd[i - 1][j] < xd[i][j]) up = dp(i - 1,j) + 1; if(i + 1 <= r && xd[i + 1][j] < xd[i][j]) down = dp(i + 1,j) + 1; //当2者都为0的时候照样成立 maxUD = up > down ? up : down; if(j - 1 >= 1 && xd[i][j - 1] < xd[i][j]) left = dp(i,j - 1) + 1; if(j + 1 <= c && xd[i][j + 1] < xd[i][j]) right = dp(i,j + 1) + 1; maxLR = left > right ? left : right; max = maxLR > maxUD ? maxLR : maxUD; len[i][j] = max; return max; */ //method2 int k; for(k = 0;k < 4;k++) if(ok(i + pos[k][0],j + pos[k][1])) if(xd[i][j] > xd[i + pos[k][0]][j + pos[k][1]]) if(len[i][j] < dp(i + pos[k][0],j + pos[k][1]) + 1) len[i][j] = dp(i + pos[k][0],j + pos[k][1]) + 1; return len[i][j]; } int main(){ cin>>r>>c; int i,j; for(i = 1;i <= r;i++) for(j = 1;j <= c;j++) { cin>>xd[i][j]; len[i][j] = 0; } int max = 0; for(i = 1;i <= r;i++) { for(j = 1;j <= c;j++) { if(max < dp(i,j)) max = dp(i,j); cout<<len[i][j]<<" "; } cout<<endl; } cout<<max + 1<<endl; return 0; }