开始时认为只要深度收索就行,没想到超时了,后来进行改进,一个点深度收索后就保留记录,下次收索时,如果该点已经收索过的话,就直接用保留的结果了。
#include<iostream>
#include<fstream>
using namespace std;
int m[100][100];
int u[100][100];
int r,c;
bool isIn(int i,int j){
if(i>=0&&i<r&&j>=0&&j<c)
return true;
else
return false;
}
int dfs(int i,int j,int len){
int len2=len;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
for(int k=0;k<4;++k){
if(isIn(i+dir[k][0],j+dir[k][1])){
if(m[i+dir[k][0]][j+dir[k][1]]>m[i][j]){
if(u[i+dir[k][0]][j+dir[k][1]]>0){
if(len+u[i+dir[k][0]][j+dir[k][1]]>len2)
len2=len+u[i+dir[k][0]][j+dir[k][1]];
}else{
int nextlen=dfs(i+dir[k][0],j+dir[k][1],1);
if(len+nextlen>len2)
len2=len+nextlen;
}
}
}
}
u[i][j]=len2;
return len2;
}
int main(){
//ifstream cin("2.txt");
cin>>r>>c;
for(int i=0;i<r;++i)
for(int j=0;j<c;++j)
cin>>m[i][j];
int maxlen=0;
for(int i=0;i<r;++i)
for(int j=0;j<c;++j){
int len=dfs(i,j,1);
if(len>maxlen)
maxlen=len;
}
cout<<maxlen<<endl;
return 0;
}