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
Input
3
2 2
1 2
3 4
2 3
1 2 1
2 3 2
1 2
1 2Output
5
7
1Constraints
- Time limit: 10000 ms
- Memory limit: 1048576 KB
- Tag: dynamic-programming
- Tag: recursion