看到这这个题的时候,我想到了用动归,但不知怎嘛用,也考虑了DFS, 但仍然不知怎嘛用……无奈,上网参考了一下别人的代码,才AC了……哎,我是菜鸟啊……
#include<iostream>
using namespace std;
int r, c;
int a[101][101];
int dp[101][101]={0};
int d[4][2]={{0,-1},{0,1},{-1,0},{1,0}};
int dfs(int i, int j)
{
int ii, jj, k, temp;
if(dp[i][j])//已处理过,直接返回
return dp[i][j];
//状态转移方程 合法的情况下:DP(i,j) = max( DP(i,j-1), DP(i,j+1), DP(i-1,j), DP(i+1,j) ) + 1;
for( k=0; k<4; k++)//由上下左右四个点得出dp[i][j]的最大值
{
ii=i+d[k][0];
jj=j+d[k][1];
if( (ii>=0&&ii<r) &&(jj>=0&&jj<c) && a[ii][jj]<a[i][j])
{
temp=dfs(ii, jj);
if( dp[i][j]<temp+1 )
dp[i][j]=temp+1;
}
}
return dp[i][j];
}
int main()
{
cin>>r>>c;
int i, j, max, temp;
max=-1;
for( i=0; i<r; i++)
for( j=0; j<c; j++)
{
cin>>a[i][j];
dp[i][j]=0;
}
for( i=0; i<r; i++)
for( j=0; j<c; j++)
{
temp=dfs(i, j);
if( max<temp )
max=temp;
}
cout<<max+1<<endl;
}