标签:soj1084 soj1084滑雪比赛 soj滑雪比赛 滑雪比赛 dfs
背景:没考虑到海拔还可以为0和负,所以就一直wrong了好久。
思路:dfs+记忆化搜索+递归。
学习:记忆化搜索。
#include <iostream>
#include <cstring>
using namespace std;
int area[52][52],memory[52][52];
int m,n,max_time,k;
int judge(int i1,int j1,int i,int j)
{
if(area[i1][j1]<area[i][j]&&i1>0&&j1>0&&i1<=n&&j1<=m)
return 1;
else return 0;
}
void dfs(int i,int j,int time)
{
bool ok=false;
if(memory[i][j])
{
time+=memory[i][j];
k=((k<time)?time:k);
max_time=((max_time<time)?time:max_time);
return;
}
if(judge(i+1,j,i,j)) {dfs(i+1,j,time+1);ok=true;}
if(judge(i,j+1,i,j)) {dfs(i,j+1,time+1);ok=true;}
if(judge(i-1,j,i,j)) {dfs(i-1,j,time+1);ok=true;}
if(judge(i,j-1,i,j)) {dfs(i,j-1,time+1);ok=true;}
if(!ok) k=((k<time)?time:k);
}
int main(void)
{
while(cin>>n>>m&&n&&m)
{
memset(area,0,sizeof(area));
memset(memory,0,sizeof(memory));
max_time=0;
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>area[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
k=0;
dfs(i,j,0);
memory[i][j]=k;
}
cout<<max_time<<endl;
}
return 0;
}
标签:soj1084 soj1084滑雪比赛 soj滑雪比赛 滑雪比赛 dfs
原文地址:http://blog.csdn.net/qiweigo/article/details/43907769