百练1088滑雪

用的递推

首先要注意需要排序(结构体排序用sort+<的重载)

其实又开了一个数组用来存数...只不过结构体排序能方便很多

 1 #include <iostream>
 2 #include <string>
 3 #include <string.h>
 4 #include <vector>
 5 #include <time.h>
 6 #include <algorithm>
 7 
 8 using namespace std;
 9 
10 //#define DEBUG(x) cout << #x << " = " << x << endl
11 using namespace std;
12 const int MAXN=110;
13 int R,C;
14 int field[MAXN][MAXN];
15 int len[MAXN][MAXN];
16 ///将所有点从小到大排序
17 struct Point{
18     int h, i, j;
19     Point(){}
20     Point(int h,int i,int j){
21         this->h=h;
22         this->i=i;
23         this->j=j;
24     }
25     bool operator<(const Point &p)const
26     {
27         return h<p.h;
28     }
29 };
30 int PN=0;
31 Point points[MAXN*MAXN];
32 int main()
33 {
34     scanf("%d %d",&R,&C);
35     for(int i=0;i<R;i++){
36         for(int j=0;j<C;j++){
37             int h;
38             scanf("%d",&h);
39             field[i][j]=h;
40             points[PN++]=Point(h,i,j);
41             len[i][j]=1;
42         }
43     }
44     sort(points,points+PN);
45     int r=-1;
46     ///人人为我型递推
47     for(int k=0;k<PN;k++){
48         int i=points[k].i,
49                 j=points[k].j,
50                 h=points[k].h;
51         if(i+1<R&&field[i+1][j]<field[i][j])len[i][j]=max(len[i][j],len[i+1][j]+1);
52         if(i-1>=0&&field[i-1][j]<field[i][j])len[i][j]=max(len[i][j],len[i-1][j]+1);
53         if(j+1<C&&field[i][j+1]<field[i][j])len[i][j]=max(len[i][j],len[i][j+1]+1);
54         if(j-1>=0&&field[i][j-1]<field[i][j])len[i][j]=max(len[i][j],len[i][j-1]+1);
55         r=max(r,len[i][j]);
56     }
57     printf("%d\n",r);
58     return 0;
59 }

猜你喜欢

转载自www.cnblogs.com/zhmlzhml/p/13385654.html