Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define MAX 100
  3. #define VISITED 1
  4. #define UNVISITED 0
  5.  
  6. using namespace std;
  7.  
  8. int X[] = {0, -1, 0, 1};    // L, U, R, D
  9. int Y[] = {-1, 0, 1, 0};    // L, U, R, D
  10. bool check[MAX][MAX];
  11. int in[MAX][MAX];
  12. int table[MAX][MAX];
  13. int N, M;
  14.  
  15. void prinTGrid()
  16. {
  17.     for(int i=1; i<=N; i++)
  18.     {
  19.         for(int j=1; j<=M; j++)
  20.         {
  21.             printf("%2d ",table[i][j]);
  22.         }
  23.         puts("");
  24.     }
  25.     puts("");
  26. }
  27.  
  28. void prinTVISIT()
  29. {
  30.     for(int i=1; i<=N; i++)
  31.     {
  32.         for(int j=1; j<=M; j++)
  33.         {
  34.             cout << check[i][j] << " ";
  35.         }
  36.         puts("");
  37.     }
  38.     puts("");
  39. }
  40.  
  41. bool isOk(int x, int y)
  42. {
  43.     return (x > 0 && x <= N && y > 0 && y <= M);
  44. }
  45.  
  46. bool isNoMove(int x, int y)
  47. {
  48.     for(int i=0; i<4; i++)
  49.     {
  50.         int moveX = x + X[i];
  51.         int moveY = y + Y[i];
  52.         if(in[x][y] > in[moveX][moveY] && isOk(moveX, moveY))
  53.         {
  54. //            cout << in[moveX][moveY] << " " << moveX << " " << moveY << endl;
  55.             return false;
  56.         }
  57.     }
  58.     return true;
  59. }
  60.  
  61. int DP(int x, int y)
  62. {
  63.     if(isNoMove(x, y))
  64.     {
  65.         check[x][y] = VISITED;
  66.         return table[x][y] = 1;
  67.     }
  68.     if(table[x][y] > 0)
  69.     {
  70.         return table[x][y];
  71.     }
  72.     for(int i=0; i<4; i++)
  73.     {
  74.         int moveX = x + X[i];
  75.         int moveY = y + Y[i];
  76.         if(isOk(moveX, moveY) && in[x][y] > in[moveX][moveY])
  77.         {
  78.             check[x][y] = VISITED;
  79.             int val = DP(moveX, moveY);
  80.             table[x][y] = max(val+1, table[x][y]);
  81.         }
  82.     }
  83.     return table[x][y];
  84. }
  85.  
  86. int main()
  87. {
  88. #ifndef ONLINE_JUDGE
  89.     freopen("in.txt", "r", stdin);
  90. #endif // ONLINE_JUDGE
  91.  
  92.     cin >> N >> M;
  93.     for(int i=1; i<=N; i++)
  94.     {
  95.         for(int j=1; j<=M; j++)
  96.         {
  97.             int x;
  98.             cin >> in[i][j];
  99.             table[i][j] = UNVISITED;
  100.             check[i][j] = UNVISITED;
  101.         }
  102.     }
  103.     for(int i=1; i<=N; i++)
  104.     {
  105.         for(int j=1; j<=M; j++)
  106.         {
  107.             if(check[i][j] == UNVISITED)
  108.             {
  109. //                cout << "START: " << i << " " << j << endl;
  110.                 int ans = DP(i, j);
  111.                 table[i][j] = max(ans, table[i][j]);
  112.             }
  113.         }
  114.     }
  115.     prinTGrid();
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement