Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. package com.company;
  2.  
  3. import java.util.*;
  4.  
  5. public class DijkstraOnSteroids {
  6.  
  7. public static void main(String[] args) {
  8. int n = 2;
  9. int m = 3;
  10. int[][] graph = {{3, 5, 6}, {4, 2, 1}};
  11. System.out.println(Solution.solve(n, m, graph));
  12. }
  13. }
  14.  
  15. class Solution {
  16.  
  17. public static int solve(int n, int m, int[][] graph) {
  18. /*
  19. //
  20. // Come up with an iterative dynamic programming solution to the ladder problem.
  21. // TODO mem[0] = ...; // Base case
  22. // TODO mem[i] = ...;
  23. */
  24.  
  25. int[][] mem = new int[n][m];
  26. TreeSet<Integer> changedLast = new TreeSet<>();
  27. TreeSet<Integer> changedCurrent = new TreeSet<>();
  28. mem[0][0] = 0;
  29. int maxLadder = 0;
  30. int nodes = n * m;
  31. for (int i = 1; i < n; i++) {
  32. for (int j = 0; j < m; j++) {
  33. mem[i][j] = Integer.MAX_VALUE;
  34. changedLast.add(i * m + j);
  35. }
  36. }
  37. for (int i = 1; i <= nodes - 1; i++) {
  38. for (int j = 0; j < n; j++) {
  39. for (int k = 0; k < m; k++) {
  40. if (changedLast.contains(j * m + k)) {
  41. if (j != 0) {
  42. int ladderCost = graph[j - 1][k] - graph[j][k];
  43. if (ladderCost < 0) {
  44. ladderCost = 0;
  45. }
  46. if (mem[j - 1][k] > mem[j][k] + ladderCost) {
  47. mem[j - 1][k] = mem[j][k] + ladderCost;
  48. changedCurrent.add(j * m + k);
  49. if (ladderCost < maxLadder) {
  50. maxLadder = ladderCost;
  51. }
  52. }
  53. }
  54. if (j != n - 1) {
  55. int ladderCost = graph[j + 1][k] - graph[j][k];
  56. if (ladderCost < 0) {
  57. ladderCost = 0;
  58. }
  59. if (mem[j + 1][k] > mem[j][k] + ladderCost) {
  60. changedCurrent.add(j * m + k);
  61. if (ladderCost > maxLadder) {
  62. maxLadder = ladderCost;
  63. }
  64. }
  65. }
  66. if (k != 0) {
  67. int ladderCost = graph[j][k - 1] - graph[j][k];
  68. if (ladderCost < 0) {
  69. ladderCost = 0;
  70. }
  71. if (mem[j][k - 1] > mem[j][k] + ladderCost) {
  72. changedCurrent.add(j * m + k);
  73. if (ladderCost > maxLadder) {
  74. maxLadder = ladderCost;
  75. }
  76. }
  77. }
  78. if (k != m - 1) {
  79. int ladderCost = graph[j][k + 1] - graph[j][k];
  80. if (ladderCost < 0) {
  81. ladderCost = 0;
  82. }
  83. if (mem[j][k + 1] > mem[j][k] + ladderCost) {
  84. changedCurrent.add(j * m + k);
  85. if (ladderCost > maxLadder) {
  86. maxLadder = ladderCost;
  87. }
  88. }
  89. }
  90. }
  91. }
  92. }
  93. changedLast = changedCurrent;
  94. changedCurrent = new TreeSet<>();
  95. }
  96.  
  97. return mem[n-1][m-1];
  98. }
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement