矩阵求和挑战

下面的算法用于将“下矩阵”转换为“后矩阵”。给定“后矩阵”,找到“前矩阵”。

该算法针对每个 after(x,y) 运行以确定它们的值。给定之后,找到之前的原始值

例子

之后 = [[2,5],[7,17]]

从之前计算之后的值

after[0][0] = before[0][0] = 2

after[0][1] = before[0][0] + before[0][1] = 2 + 3 = 5

after[1][0] = before[0][0] + before[1][0] = 2 + 5 = 7

after[1][1] = before[0][0] + before[0][1] + before[1][0] + before[1][1] = 2 + 3 + 5 + 7 =  17

完成函数 find before matrix 具有以下参数 after[n][m]: 一个 nxm 整数数组

返回: int[n][m] 表示前矩阵的 nxm 整数数组

约束

再输入一个样本

到目前为止我尝试过的

n = gets.to_i
m = gets.to_i

arr = Array.new(n){Array.new(m,0)}
sum = 0
arr_last = 0
arr_first = 0
len = 0
a.each_with_index do |d, outer_index|
  len = d.length - 1
  d.each_with_index do |b, index|
    arr_sum = d[0..index].sum
    if index > 0
      arr[outer_index][index] = sum + arr_sum
    else
      arr[outer_index][index] = arr_first + b
    end
    arr_first += b if index == 0
    arr_last = arr_sum if index == len 
  end
  sum += arr_last
end

print arr

但是对于少数测试用例它没有在时间限制内执行并且对于少数测试用例我得到了错误的答案

回答

After 网格中的每个值都是其 Before 值与其左侧和/或上方的所有 Before 值的总和。图中:

  • B 是红色区域中所有 Before 值的总和,
  • Y 是绿色和红色区域中所有 Before 值的总和,
  • X 是蓝色和红色区域中所有 Before 值的总和,以及
  • A 是紫色、蓝色、绿色和红色区域中所有 Before 值的总和。

由于XY重叠B,添加XYB计算两次。因此,如果我们开始A,减XY,然后添加B(反击加倍),我们得到的前值A,如:A' = A - X - Y + B

现在我们知道了,代码非常简单:

def before(after)
  before = []
  after.each_with_index do |row,j|
    before[j] = []
    row.each_with_index do |v,i|
      up = j <= 0 ? 0 : after[j-1][i]
      left = i <= 0 ? 0 : after[j][i-1]
      up_left = i <= 0 || j <= 0 ? 0 : after[j-1][i-1]
      before[j][i] = v - up - left + up_left
    end
  end
  before
end


以上是矩阵求和挑战的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>