东莞企业自助建站系统门户网站的发展趋势
题目描述:
有一个 m x n 大小的矩形蛋糕,需要切成 1 x 1 的小块。
给你整数 m ,n 和两个数组:
horizontalCut的大小为m - 1,其中horizontalCut[i]表示沿着水平线i切蛋糕的开销。verticalCut的大小为n - 1,其中verticalCut[j]表示沿着垂直线j切蛋糕的开销。
一次操作中,你可以选择任意不是 1 x 1 大小的矩形蛋糕并执行以下操作之一:
- 沿着水平线 
i切开蛋糕,开销为horizontalCut[i]。 - 沿着垂直线 
j切开蛋糕,开销为verticalCut[j]。 
每次操作后,这块蛋糕都被切成两个独立的小蛋糕。
每次操作的开销都为最开始对应切割线的开销,并且不会改变。
请你返回将蛋糕全部切成 1 x 1 的蛋糕块的 最小 总开销。
代码思路:
- 初始化结果: 
- 首先,将
horizontalCut和verticalCut中所有切割位置的成本相加,得到初始的结果res。这表示仅仅进行所有给定的水平切割和垂直切割的成本总和。 
 - 首先,将
 - 计算交叉切割的额外成本: 
- 接下来,代码通过两层嵌套循环遍历每一个水平切割位置
hc和每一个垂直切割位置vc。 - 对于每一对交叉的切割(即一个水平切割和一个垂直切割),它们会在矩形的某个位置相交。在这个相交点,选择水平切割成本
hc和垂直切割成本vc中的较小值作为交叉切割的额外成本(因为交点只会被切割一次,无论两个方向的成本如何,实际发生的成本是两者中的较小值)。 - 将这个较小值累加到
res中。 
 - 接下来,代码通过两层嵌套循环遍历每一个水平切割位置
 - 返回结果: 
- 最后,返回累加后的
res,它代表了进行所有给定切割以及所有交叉切割所需的最小成本总和。 
 - 最后,返回累加后的
 
代码实现:
class Solution {
public:int minimumCost(int m, int n, vector<int> &horizontalCut, vector<int> &verticalCut) {int res = std::accumulate(horizontalCut.begin(), horizontalCut.end(), 0) +std::accumulate(verticalCut.begin(), verticalCut.end(), 0);for (const auto &hc: horizontalCut)for (const auto &vc: verticalCut)res += std::min({hc, vc});return res;}
}; 
