ixenroh

Untitled

May 22nd, 2020
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.92 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define max(x, y) (((x) > (y)) ? (x) : (y))
  4. #define min(x, y) (((x) < (y)) ? (x) : (y))
  5. #define rows M
  6. #define cols N
  7.  
  8. // Returns length of the longest path beginning with mat[i][j].
  9. // This function mainly uses lookup table dp[n][n]
  10.  
  11. int M, N;
  12. int d_max = -1;
  13.  
  14. int findLongestDropping(int y, int x, int mat[rows][cols], int dpd[rows][cols], int v_vex[rows][cols], int prev_y, int prev_x)
  15. {
  16. if (y < 0 || y >= cols || x < 0 || x >= cols)
  17. return 0;
  18.  
  19. if (dpd[y][x] != -1)
  20. return dpd[y][x];
  21.  
  22. if (v_vex[y][x] != -1)
  23. return M*N;
  24.  
  25. // To store the path lengths in all the four directions
  26. int h, g, w, z = w = g = h = M*N;
  27.  
  28. // Since all numbers are unique and in range from 1 to n*n,
  29. // there is atmost one possible direction from any cell
  30. if (x < cols - 1 && x + 1 != prev_x && (mat[y][x] >= mat[y][x + 1]))
  31. h = findLongestDropping(y, x + 1, mat, dpd, v_vex, y, x);
  32.  
  33. if (x > 0 && x - 1 != prev_x && (mat[y][x] >= mat[y][x - 1]))
  34. g = findLongestDropping(y, x - 1, mat, dpd, v_vex, y, x);
  35.  
  36. if (y > 0 && y - 1 != prev_y && (mat[y][x] >= mat[y - 1][x]))
  37. z = findLongestDropping(y - 1, x, mat, dpd, v_vex, y, x);
  38.  
  39. if (y < rows - 1 && y + 1 != prev_y && (mat[y][x] >= mat[y + 1][x]))
  40. w = findLongestDropping(y + 1, x, mat, dpd, v_vex, y, x);
  41.  
  42. // If none of the adjacent fours is one greater we will take 1
  43. // otherwise we will pick maximum from all the four directions
  44. return dpd[y][x] = min(h - 1, min(g - 1, min(z - 1, min(w - 1, M*N))));
  45. }
  46.  
  47. int findLongestRising(int y, int x, int mat[rows][cols], int dpr[rows][cols], int dpd[rows][cols], int v_vex[rows][cols], int prev_y, int prev_x, int depth)
  48. {
  49. if (y < 0 || y >= rows || x < 0 || x >= cols)
  50. return 0;
  51.  
  52. v_vex[y][x] = 1;
  53.  
  54. // If this subproblem is already solved
  55. if (dpr[y][x] != -1){
  56. return dpr[y][x];
  57. }
  58.  
  59. // To store the path lengths in all the four directions
  60. int h = -1, g = -1, z = -1, w = -1;
  61.  
  62. // Since all numbers are unique and in range from 1 to n*n,
  63. // there is atmost one possible direction from any cell
  64. if (x < cols - 1 && x + 1 != prev_x && (mat[y][x] <= mat[y][x + 1]))
  65. h = 1 + findLongestRising(y, x + 1, mat, dpr, dpd, v_vex, y, x, depth + 1);
  66.  
  67. if (x > 0 && x - 1 != prev_x && (mat[y][x] <= mat[y][x - 1]))
  68. g = 1 + findLongestRising(y, x - 1, mat, dpr, dpd, v_vex, y, x, depth + 1);
  69.  
  70. if (y > 0 && y - 1 != prev_y && (mat[y][x] <= mat[y - 1][x]))
  71. z = 1 + findLongestRising(y - 1, x, mat, dpr, dpd, v_vex, y, x, depth + 1);
  72.  
  73. if (y < rows - 1 && y + 1 != prev_y && (mat[y][x] <= mat[y + 1][x]))
  74. w = 1 + findLongestRising(y + 1, x, mat, dpr, dpd, v_vex, y, x, depth + 1);
  75.  
  76. v_vex[y][x] = -1;
  77.  
  78. int dpdt[rows][cols];
  79. memset(dpdt, -1, sizeof dpdt);
  80. //dpd[y][x] = M*N - max(0, findLongestDropping(y, x, mat, dpdt, v_vex, -1, -1)) + dpr[x][y] + 1;
  81. d_max = max(d_max, M*N - max(0, findLongestDropping(y, x, mat, dpdt, v_vex, -1, -1)) - 1 + depth);
  82.  
  83. // If none of the adjacent fours is one greater we will take 1
  84. // otherwise we will pick maximum from all the four direction
  85.  
  86. return dpr[y][x] = max(h, max(g, max(z, max(w, 1))));//result_dropping))));
  87. }
  88.  
  89. // Returns length of the longest path beginning with any cell
  90. int finLongestOverAll(int mat[rows][cols])
  91. {
  92. int result = 1; // Initialize result
  93.  
  94. // Create a lookup table and fill all entries in it as -1
  95. int dpr[rows][cols];
  96. int dpd[rows][cols];
  97. int v_vex[rows][cols];
  98. memset(dpr, -1, sizeof dpr);
  99. memset(dpd, -1, sizeof dpd);
  100. memset(v_vex, -1, sizeof v_vex);
  101.  
  102. // Compute longest path beginning from all cells
  103. for (int i = 0; i < rows; i++) {
  104. for (int j = 0; j < cols; j++) {
  105. if (dpr[i][j] == -1) {
  106. findLongestRising(i, j, mat, dpr, dpd, v_vex, -1, -1, 1);
  107. memset(dpr, -1, sizeof dpr);
  108. }
  109.  
  110. // Update result if needed
  111. result = max(result, dpr[i][j]);
  112. }
  113. }
  114.  
  115. return d_max;
  116. }
  117.  
  118. int gen_nums(int S){
  119. return 75 * S % 65537;
  120. }
  121.  
  122. // Driver program
  123. int main()
  124. {
  125. int rep;
  126.  
  127. scanf("%d", &rep);
  128.  
  129. for(int r = 0; r < rep; r++){
  130. d_max = -1;
  131. int S;
  132.  
  133. scanf("%d %d %d", &S, &M, &N);
  134.  
  135. int matrix[M][N];
  136.  
  137. /*M = 5;
  138. N = 5;
  139. int matrix[5][5] = {{1, 2, 3, 4, 5},
  140. {2, 0, 4, 4, 6},
  141. {2, 0, 9, 8, 7},
  142. {2, 12, 10, 5, 7},
  143. {3, 4, 7, 4, 3}};*/
  144.  
  145. for(int y = 0; y < M; y++) {
  146. printf("\n");
  147. for (int x = 0; x < N; x++) {
  148. matrix[y][x] = S = gen_nums(S);
  149. printf("%d ", S);
  150. }
  151. }
  152.  
  153. printf("%d\n", finLongestOverAll(matrix));
  154. }
  155. }
Advertisement
Add Comment
Please, Sign In to add comment