#134 · matrix-cutting-21eba8

矩阵切割

Not startedHard
Time10.0 s
Memory1,024 MB
Submissions0
Acceptance0.0%
0%100%

Statement

Shekhu 教授有一个 N 行 M 列的矩阵,行从上到下编号为 0 到 N-1,列从左到右编号为 0 到 M-1。矩阵中的每个单元格包含一个正整数。

他想通过进行水平和垂直切割,将这个矩阵切割成 **N * M** 个子矩阵(每个大小为 1 * 1)。只能在两行或两列之间的边界上进行切割。

Shekhu 教授邀请他最好的学生 Akki 来做这项工作,并提出了一个有趣的建议。每次 Akki 在一个子矩阵中进行切割时,在他切割之前,他会获得等于该子矩阵中最小值的金币数。注意,每切割一次,子矩阵的总数就会增加。而且,任意两个不同子矩阵中的切割是独立的,同样,Akki 在不同子矩阵中的切割会独立获得奖励。

现在,Akki 有多种方式进行切割。你能帮助他最大化他能获得的总金币数吗?

Input

输入的第一行包含一个整数 T,表示测试用例的数量。接下来是 T 个测试用例。每个测试用例的第一行包含两个整数 N 和 M,如上所述。

- 接下来,有 N 行,每行包含 M 个正整数;这些描述了矩阵。

### 数据范围

- 1 ≤ T ≤ 100.
- 1 ≤ 矩阵中的每个值 ≤ 10.
- N = 1.
- 1 ≤ M ≤ 10.
- 1 ≤ N ≤ 40.
- 1 ≤ M ≤ 40.

Output

按测试用例顺序逐个输出答案:对于每个测试用例,输出一行,包含 y,其中 y 是如果 Akki 以最优顺序进行切割,他能获得的最大可能金币数。

Examples

Example 1

Input

3
2 2
1 2
3 4
2 3
1 2 1
2 3 2
1 2
1 2

Output

5
7
1

Constraints

  • Time limit: 10000 ms
  • Memory limit: 1048576 KB
  • Tag: dynamic-programming
  • Tag: recursion

Loading language catalog...