candy.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package main
  2. import "fmt"
  3. type candy struct {
  4. row int
  5. col int
  6. }
  7. const INF int = 1000000
  8. func getMinimalTime(candies []candy, n int) int {
  9. pos := make([][2]int, n)
  10. for i := range pos {
  11. pos[i][0] = INF
  12. }
  13. for _, c := range candies {
  14. pos[c.row][0] = minInt(pos[c.row][0], c.col)
  15. pos[c.row][1] = maxInt(pos[c.row][1], c.col)
  16. }
  17. dp := make([][]int, n+1)
  18. for i := range dp {
  19. dp[i] = make([]int, n)
  20. }
  21. for i := range dp[0] {
  22. dp[0][i] = INF
  23. }
  24. dp[0][0] = -1
  25. for i := 1; i <= n; i++ {
  26. for j := 0; j < n; j++ {
  27. if pos[i-1][0] == INF {
  28. dp[i][j] = 1 + dp[i-1][j]
  29. continue
  30. }
  31. dp[i][j] = INF
  32. for k := 0; k < n; k++ {
  33. if beg, end := pos[i-1][0], pos[i-1][1]; k <= beg {
  34. dp[i][j] = minInt(dp[i][j], 1+dp[i-1][k]+end-k+abs(end-j))
  35. } else if end <= k {
  36. dp[i][j] = minInt(dp[i][j], 1+dp[i-1][k]+k-beg+abs(beg-j))
  37. } else {
  38. dp[i][j] = minInt(dp[i][j], 1+dp[i-1][k]+end-beg+minInt(k-beg+abs(end-j), end-k+abs(beg-j)))
  39. }
  40. }
  41. }
  42. }
  43. min := INF
  44. for _, i := range dp[n] {
  45. min = minInt(min, i)
  46. }
  47. return min
  48. }
  49. func abs(x int) int {
  50. if x < 0 {
  51. return -x
  52. }
  53. return x
  54. }
  55. func minInt(x, y int) int {
  56. if x < y {
  57. return x
  58. }
  59. return y
  60. }
  61. func maxInt(x, y int) int {
  62. if x < y {
  63. return y
  64. }
  65. return x
  66. }
  67. func main() {
  68. // Case 1
  69. // 1 1 0 0 0
  70. // 0 1 1 0 0
  71. // 0 0 1 1 0
  72. // 0 0 0 1 1
  73. // 0 0 0 0 1
  74. var candies []candy
  75. for i := 0; i < 5; i++ {
  76. candies = append(candies, candy{i, i})
  77. if i+1 < 5 {
  78. candies = append(candies, candy{i, i + 1})
  79. }
  80. }
  81. fmt.Println(getMinimalTime(candies, 5) == 8)
  82. // Case 2
  83. // Fill all grid with candies
  84. candies = make([]candy, 0)
  85. for i := 0; i < 5; i++ {
  86. for j := 0; j < 5; j++ {
  87. candies = append(candies, candy{i, j})
  88. }
  89. }
  90. // Case 3
  91. // No candy
  92. fmt.Println(getMinimalTime(candies, 5) == 24)
  93. candies = make([]candy, 0)
  94. fmt.Println(getMinimalTime(candies, 5) == 4)
  95. }