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