The minimal path sum in the 5 by 5 matrix below, by starting in any cell in the left column and finishing in any cell in the right column, and only moving up, down, and right, is indicated in red and bold; the sum is equal to 994.
|
Solution(in Ruby)
This problem has to be attacked in the reverse order ie starting from the right to left. Lets take the last but before column. For each cell in that column, find the minimum possible sum for that cell. To find the minimum possible sum, you will have to find all the 'L' paths explored, their sum has be calculated and stored and the minimum sum has to be stored in that cell. After traversing that entire column, replace that particular column value with the minimal sum. Repeat this process for the immediate left column until you exhaust all the columns reaching the left most column. The minimal value of the leftmost column is the minimal sum which is exactly what we look for.
require 'matrix'
input = ''
file = File.new("/matrix.txt","r")
while (line = file.gets)
input += line
end
class Cell
attr_accessor :min_sum, :value
end
x = Matrix.rows(input.lines.map{|each_line| each_line.split(/,/).map{
|n|
c = Cell.new
c.min_sum = c.value = n.to_i
c
}})
MAX = x.row_size
(MAX-2).downto(0) do |column|
0.upto(MAX-1) do |row|
val_array = []
aggregate = x[row,column].value
val_array << aggregate + x[row,column+1].value
(row+1).upto(MAX-1) do |down_traverse|
aggregate += x[down_traverse,column].value
val_array << aggregate + x[down_traverse,column+1].value
end
aggregate = x[row,column].value
(row-1).downto(0) do |up_traverse|
aggregate += x[up_traverse,column].value
val_array << aggregate + x[up_traverse,column+1].value
end
x[row,column].min_sum = val_array.min
end
0.upto(MAX-1) do |each_row|
x[each_row,column].value = x[each_row,column].min_sum
end
end
val_array = []
0.upto(MAX-1) do |val|
val_array << x[val,0].value
end
puts "The minimum sum is #{val_array.min}"Hover here to see the solution
Cheers!!
Bragaadeesh.
No comments:
Post a Comment