背景:没考虑到海拔还可以为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; }
时间: 2024-10-19 01:40:05