2 * 2 矩阵的最大子矩阵Val(2 * 2)为本身
m * n 矩阵的最大子矩阵为 m * (n - 1)的最大子矩阵 Val(m*(n-1)) 和 包含第n行元素的最大子矩阵 之间的最大值
可以递推到 m * 2
m * 2 矩阵的最大子矩阵为 (m - 1) * 2 的最大子矩阵 和 包含第m列元素的最大子矩阵 之间的最大值
递推到 2 * 2
复杂度为: (m - 2) * n + (n * 2) * m = mn - 2m - 2n
看代码
//动态规划
//复杂度 (m - 2) * n + (n - 2) * m = mn - 2n - 2m
func method1(arr [][]int) int {
fmt.Println("arr:" , arr);
y := len(arr);
x := len(arr[0]);
if(x <= 2 && y <= 2){
step ++;
return arr[0][0] + arr[0][1] + arr[1][0] + arr[1][1];
}else {
if(y > 2){
max := method1(arr[1:]);
row := arr[0];
fmt.Println("循环:" , len(row));
for k , _ := range row {
if(k < x - 1){
val := arr[0][k] + arr[0][k + 1] + arr[1][k] + arr[1][k + 1];
step ++;
if(val > max){
max = val;
}
}
}
return max;
}else if(x > 2){
var col []int;
var newArr [][]int;
for _ , v := range arr{
col = append(col , v[0]);
newArr = append(newArr , v[1:]);
}
max := method1(newArr);
fmt.Println("循环:" , len(col));
for k , _ := range col {
if(k < len(col) - 1){
step ++;
val := arr[k][0] + arr[k][1] + arr[k + 1][0] + arr[k + 1][1]
if(val > max){
max = val;
}
}
}
return max;
}else {
return 0;
}
}
}