zoukankan      html  css  js  c++  java
  • 【ECJTU_ACM 11级队员2012年暑假训练赛(7) I Snow】

    I - Snow
    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


    ===========================================================================================================================================

    一不小心想到了动态规划构造的方法,结果立马代码,然后直接AC了。。。爽歪歪。。。怎么以前这样的题目都想不起来嘞。。。邪恶。。弱弱说一句,可能是被逼的。。罪过罪过。
    ===========================================================================================================================================

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <cstring>
      4 #include <algorithm>
      5 using namespace std;
      6 
      7 #define MAXN 105
      8 
      9 struct Node
     10 {
     11     int x;
     12     int y;
     13     int heigt;
     14 };
     15 
     16 bool cmp(Node a, Node b)
     17 {
     18     return (a.heigt < b.heigt) ? true : false;
     19 }
     20 
     21 int iMap[MAXN][MAXN];
     22 int iMapCount[MAXN][MAXN];
     23 Node iMapLog[MAXN * MAXN];
     24 int iLogIndex;
     25 int n, m;
     26 
     27 int dir_x[4] = {-1, 0, 1,  0};
     28 int dir_y[4] = { 0, 1, 0, -1};
     29 
     30 bool iCanGo(int x, int y)
     31 {
     32     if (x >= 1 && x <= n && y >= 1 && y <= m)
     33     {
     34         return true;
     35     }
     36     else
     37     {
     38         return false;
     39     }
     40 }
     41 
     42 void iInit()
     43 {
     44     memset(iMap, 0, sizeof(iMap));
     45     memset(iMapCount, 0, sizeof(iMapCount));
     46     memset(iMapLog, 0, sizeof(iMapLog));
     47 
     48     iLogIndex = -1;
     49     for (int i = 1; i <= n; i++)
     50     {
     51         for (int j = 1; j <= m; j++)
     52         {
     53             scanf("%d", &iMap[i][j]);
     54             iLogIndex++;
     55             iMapLog[iLogIndex].x     = i;
     56             iMapLog[iLogIndex].y     = j;
     57             iMapLog[iLogIndex].heigt = iMap[i][j];
     58         }
     59     }
     60 }
     61 
     62 void iDynamicProgramming()
     63 {
     64     sort(iMapLog,iMapLog + iLogIndex + 1, cmp);
     65 
     66 
     67     /*start kernel of Dynamic Programming*/
     68     for (int i = 0; i <= iLogIndex; i++)
     69     {
     70         int flag_x = 0;
     71         int flag_y = 0;
     72 
     73         for (int j = 0; j < 4; j++)
     74         {
     75             int next_x, next_y;
     76             next_x = iMapLog[i].x + dir_x[j];
     77             next_y = iMapLog[i].y + dir_y[j];
     78             if (iCanGo(next_x, next_y))
     79             {
     80                 if (iMap[next_x][next_y] < iMap[iMapLog[i].x][iMapLog[i].y])
     81                 {
     82                     if (flag_x == 0 && flag_y == 0)
     83                     {
     84                         flag_x = next_x;
     85                         flag_y = next_y;
     86                     }
     87                     else if (iMapCount[next_x][next_y] > iMapCount[flag_x][flag_y])
     88                     {
     89                         flag_x = next_x;
     90                         flag_y = next_y;
     91                     }
     92                 }
     93             }
     94         }
     95         if (flag_x == 0 && flag_y == 0)
     96         {
     97             iMapCount[iMapLog[i].x][iMapLog[i].y] = 1;
     98         }
     99         else
    100         {
    101             iMapCount[iMapLog[i].x][iMapLog[i].y] = iMapCount[flag_x][flag_y] + 1;
    102         }
    103     }
    104 }
    105 
    106 void iGetMax()
    107 {
    108     int max = iMapCount[1][1];
    109     for (int i = 1; i <= n; i++)
    110     {
    111         for (int j = 1; j <= m; j++)
    112         {
    113             if (iMapCount[i][j] > max)
    114             {
    115                 max = iMapCount[i][j];
    116             }
    117         }
    118     }
    119     cout << max << endl;
    120 }
    121 
    122 int main()
    123 {
    124     //freopen("in.dat", "r", stdin);
    125     while (scanf("%d%d", &n, &m) != EOF)
    126     {
    127         iInit();
    128         iDynamicProgramming();
    129         iGetMax();
    130     }
    131     return 0;
    132 }
    133 
    134 // end
    135 // ism
  • 相关阅读:
    课堂练习
    日程管理测试用例
    日程管理APP的测试计划和测试矩阵
    日程管理Bug Report
    图书管理系统活动图
    团队如何做决定?
    课堂练习
    课堂练习(NABCD Model)
    课堂练习
    日程管理的测试计划和测试矩阵
  • 原文地址:https://www.cnblogs.com/ismdeep/p/2624408.html
Copyright © 2011-2022 走看看