SHTSC 2002
思路:对每个点进行搜索,已经搜索过的点用数组记录下来,避免下次重复搜索,16ms。
#include<iostream> #include<cstdio> #include<cstring> #include<math.h> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; const int maxn=105; int n,m; int a[maxn][maxn]; int dp[maxn][maxn]; int dx[]={-1,1,0,0};//x方向 int dy[]={0,0,-1,1};//y方向 bool judge(int x,int y){//判断是否越界 if(x<=0||x>n||y<=0||y>m) return false; return true; } int dfs(int x,int y){ if(dp[x][y]){//记忆化,如果已经搜索过,则不需要重复搜索,直接返回 return dp[x][y]; } for(int i=0;i<4;i++){//遍历四个方向,注意结果取四个点中的最大值 int tmpx=x+dx[i]; int tmpy=y+dy[i]; if(judge(tmpx,tmpy)&&a[tmpx][tmpy]<a[x][y]){ dp[x][y]=max(dp[x][y],dfs(tmpx,tmpy)+1); } } return dp[x][y]; } int main() { #ifndef ONLINE_JUDGE freopen("test.in","r",stdin); freopen("test.out","w",stdout); #endif while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&a[i][j]); } } memset(dp,0,sizeof(dp)); int res=-INF; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(!dp[i][j]){//对没进行搜索到的点进行搜索 dp[i][j]=dfs(i,j); if(dp[i][j]>res) res=dp[i][j]; } } } printf("%d\n",res+1);//最后加上这个点本身即为最优解 } return 0; }