题意很简单,就是在一个二维数组中寻找连续下降序列的最长长度。用x[4],y[4]表示上下左右,a[i][j]表示第(i,j)的位置开始的下降序列,即可以滑雪的长度。
注意判断边界条件,当a[i][j]不等于零时直接返回,提高效率。
注意输出时要加一,因为出发点就算1个。
将判断写进自定义函数里,用时直接去最大值就行。
代码如下:
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int a[102][102],b[102][102],x[4]={-1,0,1,0},y[4]={0,-1,0,1};
int dp(int i,int j)
{
int k;
if(a[i][j]>0) return a[i][j];
for(k=0;k<4;k++) {
if (b[i+x[k]][j+y[k]]!=-1&&b[i+x[k]][j+y[k]]<b[i][j] )
{
if ( a[i][j]< dp(i+x[k],j+y[k])+1 )
a[i][j]=dp(i+x[k],j+y[k])+1;
}
}
return a[i][j];
}
int main()
{
int n,i,j,m,c,d;
while (cin>>m>>n)
{memset(a,0,sizeof(a));memset(b,-1,sizeof(b));
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
{cin>>b[i][j];
}
c=0; for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
if (dp(i,j)>c) c=dp(i,j);
cout<<c+1<<endl;
}
}