#include<iostream>
using namespace std;
int R,C,s[101][101];
int Max=0;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void findpath(int i,int j,int dep)
{
if(Max<dep) Max=dep;
int x,y;
for(int k=0;k<4;k++)
{
x=i+dir[k][0];
y=j+dir[k][1];
if(x>=0 && x<R && y>=0 && y<C && s[i][j]>s[x][y])
{
findpath(x,y,dep+1);
}
}
}
int main()
{
while(cin>>R>>C)
{
Max=0;
for(int i=0;i<R;i++)
{
for(int j=0;j<C;j++)
{
cin>>s[i][j];
}
}
for(int i=0;i<R;i++)
{
for(int j=0;j<C;j++)
{
findpath(i,j,0);
}
}
cout<<Max+1<<endl;
}
return 0;
}
加了dp[][]保存中间数据后
#include<iostream>
using namespace std;
int m,n,dp[101][101],s[101][101];
int dfs(int i,int j)
{
int e=0,south=0,w=0,north=0,max=0;
if(dp[i][j]!=0) return dp[i][j];
if(i>=0 && i<m && j+1>=0 && j+1<n && s[i][j+1]<s[i][j])
e=dfs(i,j+1);
if(i+1>=0 && i+1<m && j>=0 && j<n && s[i+1][j]<s[i][j])
south=dfs(i+1,j);
if(i>=0 && i<m && j-1>=0 && j-1<n && s[i][j-1]<s[i][j])
w=dfs(i,j-1);
if(i-1>=0 && i-1<m && j>=0 && j<n && s[i-1][j]<s[i][j])
north=dfs(i-1,j);
if(e>max) max=e;
if(south>max) max=south;
if(w>max) max=w;
if(north>max) max=north;
return max+1;
}
int main()
{
int max;
while(cin>>m>>n)
{
max=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>s[i][j];
dp[i][j]=0;
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
dp[i][j]=dfs(i,j);
if(dp[i][j]>max)
max=dp[i][j];
}
}
cout<<max<<endl;
}
return 0;
}
对点排序后效果
#include<iostream>
#include<algorithm>
using namespace std;
int m,n,dp[101][101],s[101][101];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int dfs(int i,int j)
{
int e=0,max=0;
if(dp[i][j]!=0) return dp[i][j];
for(int k=0;k<4;k++)
{
if(i+dir[k][0]>=0 && i+dir[k][0]<m && j+dir[k][1]>=0 && j+dir[k][1]<n && s[i+dir[k][0]][j+dir[k][1]]<s[i][j])
e=dfs(i+dir[k][0],j+dir[k][1]);
if(e>max) max=e;
}
return max+1;
}
struct node
{
int i;
int j;
int data;
} v[10010];
bool cmp(node a,node b)
{
if(a.data<b.data) return 1;
else return 0;
}
int main()
{
int max;
node t;
while(cin>>m>>n)
{
max=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cin>>s[i][j];
t.i=i;
t.j=j;
t.data=s[i][j];
v[i*n+j]=t;
dp[i][j]=0;
}
}
sort(v,v+m*n,cmp);
for(int i=0;i<m*n;i++)
{
dp[v[i].i][v[i].j]=dfs(v[i].i,v[i].j);
if(dp[v[i].i][v[i].j]>max)
max=dp[v[i].i][v[i].j];
}
cout<<max<<endl;
}
return 0;
}