POJ-1088-滑雪
http://poj.org/problem?id=1088
从每一个点深搜,果然超时了,因为这要重复计算很多次,优化一下,将搜索过的点记录下来,避免重复计算即可
超时的代码
#include<stdio.h> #include<string.h> #include<stdlib.h> int map[105][105]; int n1,n2,ans; int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; int go(int x,int y) { if(0<=x&&x<n1&&0<=y&&y<n2) return 1; return 0; } void dfs(int x,int y,int cnt) { int i; int tx,ty; if(cnt>ans) ans=cnt; for(i=0;i<4;i++) { tx=x+dir[i][0]; ty=y+dir[i][1]; if(go(tx,ty)&&map[x][y]>map[tx][ty]) dfs(tx,ty,cnt+1); } } int main() { int i,j,Max; scanf("%d %d",&n1,&n2); for(i=0;i<n1;i++) for(j=0;j<n2;j++) scanf("%d",&map[i][j]); Max=0; for(i=0;i<n1;i++) for(j=0;j<n2;j++) { ans=0; dfs(i,j,1); if(ans>Max) Max=ans; } printf("%d\n",Max); return 0; }
优化后的AC的代码
#include<stdio.h> #include<string.h> #include<stdlib.h> int map[105][105]; int sol[105][105]; int n1,n2,ans; int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; int go(int x,int y) { if(0<=x&&x<n1&&0<=y&&y<n2) return 1; return 0; } int dfs(int x,int y) { int i,k,tx,ty; if(sol[x][y]!=0) return sol[x][y]; for(i=0;i<4;i++) { tx=x+dir[i][0]; ty=y+dir[i][1]; if(go(tx,ty)&&map[x][y]>map[tx][ty]) { k=dfs(tx,ty); if(sol[x][y]<k+1) sol[x][y]=k+1; } } return sol[x][y]; } int main() { int i,j,Max; scanf("%d %d",&n1,&n2); for(i=0;i<n1;i++) for(j=0;j<n2;j++) scanf("%d",&map[i][j]); memset(sol,0,sizeof(sol)); Max=0; for(i=0;i<n1;i++) for(j=0;j<n2;j++) { if(sol[i][j]==0) dfs(i,j); if(sol[i][j]>Max) Max=sol[i][j]; } printf("%d\n",Max+1); return 0; }