uva 10285 Longest Run on a Snowboard

题意:

给出一个矩阵,找出这个矩阵中严格最长下降序列的长度,可以从上下左右四个方向下降。

思路:

记忆化搜索一遍即可。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <string>
 5 #include <iostream>
 6 using namespace std;
 7 const int N = 100 + 5;
 8 const int dx[4] = {0,0,1,-1},dy[4] = {1,-1,0,0};
 9 int a[N][N],dp[N][N];
10 int n,m;
11 int dfs(int x,int y)
12 {
13     if (~dp[x][y]) return dp[x][y];
14     int ans = 0;
15     for (int i = 0;i < 4;i++)
16     {
17         int nx = x + dx[i],ny = y + dy[i];
18         if (nx < 0) continue;
19         if (ny < 0) continue;
20         if (nx >= n) continue;
21         if (ny >= m) continue;
22         if (a[nx][ny] < a[x][y])
23         {
24             ans = max(dfs(nx,ny),ans);
25         }
26     }
27     return dp[x][y] = ans + 1;
28 }
29 int main()
30 {
31     int t;
32     scanf("%d",&t);
33     while (t--)
34     {
35         string s;
36         cin >> s;
37         scanf("%d%d",&n,&m);
38         memset(dp,-1,sizeof(dp));
39         for (int i = 0;i < n;i++)
40         {
41             for (int j = 0;j < m;j++)
42             {
43                 scanf("%d",&a[i][j]);
44             }
45         }
46         for (int i = 0;i < n;i++)
47         {
48             for (int j = 0;j < m;j++)
49             {
50                 dfs(i,j);
51             }
52         }
53         int ans = 0;
54         for (int i = 0;i < n;i++)
55         {
56             for (int j = 0;j < m;j++)
57             {
58                 ans = max(ans,dp[i][j]);
59             }
60         }
61         cout << s << ": " << ans << endl;
62     }
63     return 0;
64 }

 

posted @ 2018-05-01 21:54  qrfkickit  阅读(158)  评论(0编辑  收藏  举报