1 solutions
-
0
思路:二维前缀和
给定一个 的矩阵,矩阵中的每个点,都有一个价值 ,我们需要找到一个价值最大的矩阵,该矩阵的价值为其范围内所有点的价值之和,同时,每包含一个点,就需要减去 的价值。
我们很容易想到,在直到矩阵大小后,我们能够 的计算出里面有多少个点,但是我们缺少一种方法,一种能够快速求得矩阵内价值总和的方法。
这种方法就是
二维前缀和
,它能够在 的预处理后, 获得我们想要的答案。二位前缀和的原理如下:
假设我们有一个矩阵
定义:
$$a = \begin{Bmatrix} 0&1&2&3\\ 4&5&6&6\\ 8&9&10&11\\ 12&13&14&15 \end{Bmatrix} $$表示从左上角(1,1)到(i,j)的一个矩形的和,比如。
那么是怎么求来的呢?
我们在计算该数组时,从上往下,从左往右计算,那么当我们计算到时,它的左上一块矩阵的值就必定是已经计算好了。
好了,现在我们手上有以下三个数据 ,我们的目标是求出 。
根据 数组的定义, 就是红+绿, 就是红+浅蓝,而 就是红,于是我们可以很容易发现:
$pre[i][j] = pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]+a[i][j]$
即:红+绿+红+浅蓝-红+蓝
这样我们就得到了一个 数组。当我们用 数组去求解我们需要的答案时,其实就是逆向的过程。这里不做讲解,留给读者自己理解。(可以想想,当我们拥有了 数组后,该如何求蓝色部分的值?)
代码
C++
python
Java
Go
Js
- 1
Information
- ID
- 37
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 6
- Tags
- # Submissions
- 19
- Accepted
- 3
- Uploaded By