1120: trs滑雪
时间限制: 1 Sec 内存限制: 128 MB提交: 70 解决: 27
[ 提交][ 状态][ 讨论版]
题目描述
trs喜欢滑雪。他来到了一个滑雪场,这个滑雪场是一个矩形,为了简便,我们用r行c列的矩阵来表示每块地形。为了得到更快的速度,滑行的路线必须向下倾斜。 例如样例中的那个矩形,可以从某个点滑向上下左右四个相邻的点之一。例如24-17-16-1,其实25-24-23…3-2-1更长,事实上这是最长的一条。
输入
输入文件 第1行: 两个数字r,c(1< =r,c< =100),表示矩阵的行列。第2..r+1行:每行c个数,表示这个矩阵。
输出
输出文件 仅一行: 输出1个整数,表示可以滑行的最大长度。
样例输入
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
样例输出
25
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<queue> #include<stack> #include<vector> #include<map> #include<algorithm> using namespace std; #define ll long long #define ms(a,b) memset(a,b,sizeof(a)) const int M=1e3+10; const int inf=0x3f3f3f3f; int i,j,k,n,m; int mp[M][M]; int flag[M][M]; int dp[M][M]; int dir[4][2]={-1,0,1,0,0,-1,0,1}; int rec(int x,int y) { if(flag[x][y])return dp[x][y]; for(int i=0;i<4;i++){ int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(xx>=0&&yy>=0&&xx<n&&yy<m&&mp[xx][yy]<mp[x][y]) dp[x][y]=max(dp[x][y],rec(xx,yy)+1); } flag[x][y]=1; return dp[x][y]; } int main() { while(~scanf("%d%d",&n,&m)){ for(int i=0;i<n;i++) for(int j=0;j<m;j++) scanf("%d",&mp[i][j]),dp[i][j]=1; ms(flag,0); int ans=1; for(int i=0;i<n;i++) for(int j=0;j<m;j++){ ans=max(ans,rec(i,j)); } printf("%d\n",ans); } return 0; }