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"string.h" #include"stdlib.h" #include"algorithm" using namespace std; int m,n; int dp[40400]; struct node { int h,x,y; }ai[40040]; bool compare(node a,node b) { return a.h<b.h; } bool check(node a,node b) { if(((a.x==b.x&&abs(a.y-b.y)==1)||(a.y==b.y&&abs(a.x-b.x)==1))&&b.h>a.h) return true; return false; } int main() { int num=0; cin>>m>>n; for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { cin>>ai[num].h; ai[num].x=i; ai[num].y=j; num++; } } sort(ai,ai+m*n,compare); int mmax=1; for(int i=0;i<num;i++) { dp[i]=1; for(int j=0;j<i;j++) { if(check(ai[j],ai[i])) { dp[i]=max(dp[i],dp[j]+1); } } if(dp[i]>mmax) mmax=dp[i]; } cout<<mmax<<endl; return 0; }