#include <stdio.h> #define maxsize 100 #define inf 10001 int hill[maxsize+2][maxsize+2]; int vis[maxsize+2][maxsize+2]; const int dis[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int DFS(int x,int y) { int i; for(i=0; i<4; i++){ if(hill[x][y]>hill[x+dis[i][0]][y+dis[i][1]]&&vis[x][y]+1>vis[x+dis[i][0]][y+dis[i][1]]){ vis[x+dis[i][0]][y+dis[i][1]]=vis[x][y]+1; DFS(x+dis[i][0],y+dis[i][1]); } } return 0; } int main() { int m,n; int i,j,max; int x,y; scanf("%d %d",&m,&n); for(i=0; i<=m+1; i++) hill[i][0]=hill[i][n+1]=inf; for(i=0; i<=n+1; i++) hill[0][i]=hill[m+1][i]=inf; for(i=1; i<=m; i++){ for(j=1; j<=n; j++){ scanf("%d",&hill[i][j]); vis[i][j]=0; } } while(1){ max=-1; for(i=1; i<=m; i++) for(j=1; j<=n; j++) if(vis[i][j]==0&&hill[i][j]>max){ max=hill[i][j]; x=i; y=j; } if(max==-1) break; vis[x][y]=1; DFS(x,y); } for(i=1; i<=m; i++) for(j=1; j<=n; j++){ if(max<vis[i][j]) max=vis[i][j]; } printf("%d",max); return 0; }
解体报告:
在最长路径的情况下,Ai->Ai-1->----->A1,它的子结构Ai-1->----->A0,也是最优的。
所以搜索中如果遇到已经路过的节点,看是否路程长度增大。若是,则该路径有可能成为解,
否则直接排出可能性。所以只要保证,每个节点都经历过,便能求得解。
因为不用求路径,所以每个点只用一个数字就可以记录改点是否经过,和该点的最长路程。
每次DFS前找到点最高且没有经过的节点开始搜索。最后找到记录里最大的值,便是解。