深搜加剪枝
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
int used[105][105];
int R,C;
int map[105][105];
int ans=0;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
bool vist[105][105];
bool canmove(int x,int y){
if(x>=0&&y>=0&&x<R&&y<C) return true;
else return false;
}
int dfs(int x,int y)
{
int i,j;
int tx,ty,tans=0;
vist[x][y]=true;
for(i=0;i<4;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if(canmove(tx,ty)&&!vist[tx][ty]&&map[tx][ty]<map[x][y])
{
if(used[tx][ty]==0) used[tx][ty]=dfs(tx,ty);
tans=max(tans,used[tx][ty]);
}
}
vist[x][y]=false;
ans=max(ans,tans+1);
return tans+1;
}
int main()
{
int i,j;
while(scanf("%d%d",&R,&C)!=EOF)
{
memset(used,0,sizeof(used));
memset(vist,0,sizeof(vist));
for(i=0;i<R;i++)
{
for(j=0;j<C;j++)
scanf("%d",&map[i][j]);
}
ans=0;
for(i=0;i<R;i++)
{
for(j=0;j<C;j++)
{
used[i][j]=dfs(i,j);
//cout<<"i:"<<i<<"j:"<<j<<"ans:"<<used[i][j]<<endl;
}
}
printf("%d\n",ans);
}
return 0;
}