【动态规划】Vijos P1011 清帝之惑之顺治

题目链接:

  https://vijos.org/p/1011

题目大意

  给一张N*M的地图(N,M<=500),可从任一点开始沿上下左右走,只能走比当前低的地方。问最长能走多少格。

题目思路:

  【动态规划】

  这题就是滑雪,动态规划。

  将高度排序后从低往高算,当前高度所在的格子上下左右比当前高度低就可以用来更新答案。

 

 1 //
 2 //by coolxxx
 3 //
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<string>
 7 #include<iomanip>
 8 #include<memory.h>
 9 #include<time.h>
10 #include<stdio.h>
11 #include<stdlib.h>
12 #include<string.h>
13 #include<stdbool.h>
14 #include<math.h>
15 #define min(a,b) ((a)<(b)?(a):(b))
16 #define max(a,b) ((a)>(b)?(a):(b))
17 #define abs(a) ((a)>0?(a):(-(a)))
18 #define lowbit(a) (a&(-a))
19 #define sqr(a) (a)*(a)
20 #define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
21 #define eps 1e-8
22 #define J 10000
23 #define MAX 0x7f7f7f7f
24 #define PI 3.1415926535897
25 #define N 504
26 #define M 500004
27 using namespace std;
28 int n,m,lll,ans,cas;
29 struct xxx
30 {
31     int map,x,y;
32 }a[N*N];
33 int mm[N][N],d[N][N];
34 int xx,yy,nowx,nowy;
35 int dx[]={-1,1,0,0};
36 int dy[]={0,0,-1,1};
37 bool cmp(xxx aa,xxx bb)
38 {
39     return aa.map<bb.map;
40 }
41 int main()
42 {
43     #ifndef ONLINE_JUDGE
44 //    freopen("1.txt","r",stdin);
45 //    freopen("2.txt","w",stdout);
46     #endif
47     int i,j,k;
48 //    while(~scanf("%s%d",s,&n))
49     while(~scanf("%d",&n) && n)
50     {
51         scanf("%d",&m);
52         for(i=1;i<=n;i++)
53         {
54             for(j=1;j<=m;j++)
55             {
56                 scanf("%d",&a[i*m-m+j].map);
57                 mm[i][j]=a[i*m-m+j].map;
58                 a[i*m+j-m].x=i;
59                 a[i*m-m+j].y=j;
60             }
61         }
62         sort(a+1,a+1+n*m,cmp);
63         for(i=1;i<=n*m;i++)
64         {
65             nowx=a[i].x;
66             nowy=a[i].y;
67             for(j=0;j<4;j++)
68             {
69                 xx=nowx+dx[j];
70                 yy=nowy+dy[j];
71                 if(xx>0 && xx<=n && yy>0 && yy<=m)
72                 {
73                     if(mm[xx][yy]<mm[nowx][nowy])
74                         d[nowx][nowy]=max(d[nowx][nowy],d[xx][yy]+1);
75                 }
76             }
77             ans=max(d[nowx][nowy],ans);
78         }
79         printf("%d\n",ans+1);
80     }
81     return 0;
82 }
83 
84 
85 /*
86 //
87 
88 //
89 */
View Code

 

posted @ 2016-04-02 19:55  Cool639zhu  阅读(411)  评论(0编辑  收藏  举报