POJ-1088-滑雪

来源:互联网 发布:专业绘画软件下载 编辑:程序博客网 时间:2024/05/10 01:09

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;}




原创粉丝点击