思路:
分别以数组中的每个位置为起点,用dfs进行上下左右深搜,后一个值一定要小于前一个值(不能等于)。搜完一个起点的值后,保存以这个点为起点的值,在下一次搜到这个点时直接引用以前的值。
这题注意一点,要用一个dp去记录状态,没就是搜过的点的状态要记录下来,下找到这点直接引用.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[102][102];
int dp[102][102];
int b[4][2]= {1,0,-1,0,0,1,0,-1};
int r,c;
int Max;
int solve(int x,int y,int sum)
{
for(int i=0; i<4; i++)
{
int d_i=x+b[i][0];
int d_j=y+b[i][1];
if(d_i<=0||d_i>r||d_j<=0||d_j>c||(a[x][y]<=a[d_i][d_j])) //约束条件
{
if(sum>Max)
Max=sum;
continue;
}
if(dp[d_i][d_j]>1) //判断以前是否有搜过这个点
{
if(sum+dp[d_i][d_j]>Max)
Max=sum+dp[d_i][d_j];
continue;
}
solve(d_i,d_j,sum+1);
}
}
int main()
{
cin>>r>>c;
int m=0;
for(int i=1; i<=r; i++)
for(int j=1; j<=c; j++)
{
cin>>a[i][j];
dp[i][j]=1;
}
for(int i=1; i<=r; i++)
for(int j=1; j<=c; j++)
{
Max=0;
solve(i,j,1);
dp[i][j]=Max;
if(m<Max)
m=Max;
}
cout<<m<<endl;
return 0;
}