当初唯一写的一篇文章就是这一篇,结果还丢了,哎,啥也不说了。 以下是代码: #include<stdio.h> int m,n,z[101][101],sum[101][101]; //只有计算过之后才有: f(x, y) == sum[x][y]; int f(int x, int y) //返回值一定要是int型,而不能是void型,计算过之后f(x, y) == sum[x][y],可以返回上一层; { int max=0; //在初始时就将sum[][]置为零,以后便于判断是否计算过,计算过就返回,这就是记忆化搜索; if(sum[x][y]>0) return sum[x][y]; //对四个方向分别判断,不用循环,效率更高,每次判断是否出界只需判断一个条件就够,同时用max记下四个方向中最大的值; if(y-1>=0) { if(z[x][y]>z[x][y-1]) if(f(x,y-1)>max) //此处是f(x, y),而非sum[x][y],只有当f(x, y)被计算过后二者才相等,否则sum[x][y]==0. max=sum[x][y-1]; } if(y+1<m) { if(z[x][y]>z[x][y+1]) if(f(x,y+1)>max) max=sum[x][y+1]; } if(x-1>=0) { if(z[x][y]>z[x-1][y]) if(f(x-1,y)>max) max=sum[x-1][y]; } if(x+1<n) { if(z[x][y]>z[x+1][y]) if(f(x+1,y)>max) max=sum[x+1][y]; } //四个方向都不存在有效值时,max==0; return sum[x][y] = max+1; //此后对于此点而言,f(x, y)==sum[x][y]; } int main() { int i,j,temp; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) for(j=0;j<m;j++) { scanf("%d",&z[i][j]); sum[i][j]=0; //初始为零很重要; } for(i=0;i<n;i++) for(j=0;j<m;j++) f(i,j); //依次计算各点的值; //找出最大值并输出; temp=0; for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(sum[i][j]>temp) temp=sum[i][j]; } } printf("%d/n",temp); } return 0; }