这题不难,状态转移方程很快就写出来 m[i, j]=max{m[i-1, j](下)+1,m[i, j-1](左)+1,m[i+1, j](上)+1,m[i, j+1](右)+1}(若下左上右对应元素比s[i, j]小,则对应的m[ ]就可以出现在方程中)
具体实现的话也很简单,处理max{ }用冒泡法,注意边界就行。在cout的时候,没有“+1 ”,试了几组数据,才知道那个错误。之所以要加上1,是因为最后那个m[ ]没有把最大元素算进去!
#include <iostream>
using namespace std;
int s[101][101];
int m[101][101]={0};
int findmax(int R,int C,int i,int j)
{
int temp=0;
if(m[i][j]>0)
return m[i][j];
if(i-1>0 && s[i][j]>s[i-1][j]){
temp=findmax(R,C,i-1,j)+1;
if(temp>m[i][j])
m[i][j]=temp;
}
if(j-1>0 && s[i][j]>s[i][j-1]){
temp=findmax(R,C,i,j-1)+1;
if(temp>m[i][j])
m[i][j]=temp;
}
if(i+1<=R && s[i][j]>s[i+1][j]){
temp=findmax(R,C,i+1,j)+1;
if(temp>m[i][j])
m[i][j]=temp;
}
if(j+1<=C && s[i][j]>s[i][j+1]){
temp=findmax(R,C,i,j+1)+1;
if(temp>m[i][j])
m[i][j]=temp;
}
return m[i][j];
}
int findmaxm(int R,int C)
{
int max=0;
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++){
m[i][j]=findmax(R,C,i,j);
if(m[i][j]>max)
max=m[i][j];
}
return max;
}
int main()
{
int R,C;
cin >> R >> C;
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
cin>>s[i][j];
cout<<findmaxm(R,C)+1<<endl;
return 0;
}