POJ1088

来源:互联网 发布:天猫双十一直播数据 编辑:程序博客网 时间:2024/06/05 17:18
                                                                     滑雪
                                               Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u


Description

Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子

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


一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。

Input
输入的第一行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。

Output
输出最长区域的长度。

Sample Input


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

Sample Output

25


解题思路:

      大意就是在图里求一条最长的递减序列,输出递减序列的长度。记忆化搜索,首先把dp数组初始化为1,然后两层循环,

用dp[ i ][ j ]来存每个点搜索到的路径长度,并且更新最大路径长度。搜索时在每个点沿四个方向搜,更新maxx,得出的路径

长度h等于gethigh值加1.




AC代码:

#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cstring>#include <cassert>#include <cstdio>#include <string>#include <vector>#include <bitset>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <list>#include <set>#include <map>#define REP0(i, n) for (int i=0;i<int(n);++i)#define REP1(i, n) for (int i=1;i<=int(n);++i)#define FOR(i, a, b) for (int i=int(a);i<int(b);++i)#define DWN(i, b, a) for (int i=int(b-1);i>=int(a);--i)using namespace std;#define REP(i, n) for (int i=0;i<int(n);++i)#define FOR(i, a, b) for (int i=int(a);i<int(b);++i)#define DWN(i, b, a) for (int i=int(b-1);i>=int(a);--i)#define REP_1(i, n) for (int i=1;i<=int(n);++i)#define FOR_1(i, a, b) for (int i=int(a);i<=int(b);++i)#define DWN_1(i, b, a) for (int i=int(b);i>=int(a);--i)#define REP_C(i, n) for (int n____=int(n),i=0;i<n____;++i)#define FOR_C(i, a, b) for (int b____=int(b),i=a;i<b____;++i)#define DWN_C(i, b, a) for (int a____=int(a),i=b-1;i>=a____;--i)#define REP_N(i, n) for (i=0;i<int(n);++i)#define FOR_N(i, a, b) for (i=int(a);i<int(b);++i)#define DWN_N(i, b, a) for (i=int(b-1);i>=int(a);--i)#define REP_1_C(i, n) for (int n____=int(n),i=1;i<=n____;++i)#define FOR_1_C(i, a, b) for (int b____=int(b),i=a;i<=b____;++i)#define DWN_1_C(i, b, a) for (int a____=int(a),i=b;i>=a____;--i)#define REP_1_N(i, n) for (i=1;i<=int(n);++i)#define FOR_1_N(i, a, b) for (i=int(a);i<=int(b);++i)#define DWN_1_N(i, b, a) for (i=int(b);i>=int(a);--i)#define REP_C_N(i, n) for (n____=int(n),i=0;i<n____;++i)#define FOR_C_N(i, a, b) for (b____=int(b),i=a;i<b____;++i)#define DWN_C_N(i, b, a) for (a____=int(a),i=b-1;i>=a____;--i)#define REP_1_C_N(i, n) for (n____=int(n),i=1;i<=n____;++i)#define FOR_1_C_N(i, a, b) for (b____=int(b),i=a;i<=b____;++i)#define DWN_1_C_N(i, b, a) for (a____=int(a),i=b;i>=a____;--i)//#define ECH(it, A) for (typeof(A.begin()) it=A.begin(); it != A.end(); ++it)#define ECH(it, A) for (__typeof(A.begin()) it=A.begin(); it != A.end(); ++it)#define REP_S(it, str) for (char*it=str;*it;++it) // 用于字符串的 .. .#define REP_G(it, u) for (int it=hd[u];it;it=suc[it]) // 用于图论的 .. .#define DO(n) for ( int ____n ## __line__ = n; ____n ## __line__ -- ; )#define REP_2(i, j, n, m) REP(i, n) REP(j, m)#define REP_2_1(i, j, n, m) REP_1(i, n) REP_1(j, m)#define REP_3(i, j, k, n, m, l) REP(i, n) REP(j, m) REP(k, l)#define REP_3_1(i, j, k, n, m, l) REP_1(i, n) REP_1(j, m) REP_1(k, l)#define ALL(A) A.begin(), A.end()#define LLA(A) A.rbegin(), A.rend()#define CPY(A, B) memcpy(A, B, sizeof(A))#define INS(A, P, B) A.insert(A.begin() + P, B)#define ERS(A, P) A.erase(A.begin() + P)#define BSC(A, X) find(ALL(A), X) // != A.end()#define CTN(T, x) (T.find(x) != T.end())#define SZ(A) int(A.size())#define PB push_back#define MP(A, B) make_pair(A, B)#define PTT pair<T, T>#define fi first#define se second#define Rush int T____; RD(T____); DO(T____)#define Display(A, n, m) {                      \    REP(i, n){                                  \        REP(j, m) cout << A[i][j] << " ";       \        cout << endl;                         \    }                                           \}#define Display_1(A, n, m) {                    \    REP_1(i, n){                                \        REP_1(j, m) cout << A[i][j] << " ";     \        cout << endl;                         \    }                                           \}typedef long long LL;typedef double DB;const int dx[] = {-1, 0, 1, 0};const int dy[] = {0, 1, 0, -1};const int MOD = 1000000007;//int MOD = 99990001;const int INF = 0x3f3f3f3f;const LL INFF = 1LL << 60;const DB EPS = 1e-9;const DB OO = 1e15;const DB PI = acos(-1.0); //M_PI;#define N 101int maps[N][N] , dp[N][N];int r , c , i , j , h;int gethigh(int i , int j){    if(dp[i][j] > 1)        return dp[i][j];    int maxx = 1;    if(maps[i][j] > maps[i][j-1] && j - 1 >= 0)    {        h = gethigh(i , j - 1) + 1;        if(h > maxx)            maxx = h;    }    if(maps[i][j] > maps[i][j+1] && j + 1 < c)    {        h = gethigh(i , j + 1) + 1;         if(h > maxx)            maxx = h;    }    if(maps[i][j] > maps[i-1][j] && i - 1 >= 0)    {        h = gethigh(i - 1, j) + 1;         if(h > maxx)            maxx = h;    }     if(maps[i][j] >maps[i+1][j] && i + 1 < r)    {        h = gethigh(i + 1, j) + 1;         if(h > maxx)            maxx = h;    }    return maxx;}int main(){    #ifdef ZH    freopen("in.txt","r",stdin);    #endif    while(~scanf("%d%d",&r,&c))    {        REP(i , r)        {            REP(j, c)            {                scanf("%d",&maps[i][j]);                dp[i][j] = 1;            }        }        int res = 0;        REP(i , r)        {            REP(j , c)            {                dp[i][j] = gethigh(i , j);                if(dp[i][j] > res)                    res = dp[i][j];            }        }        printf("%d\n",res);    }}


0 0
原创粉丝点击