8*8矩阵内存储1-9的数字,找到一个4*4方阵使其和最小。请用C++实现
时间: 2023-12-06 09:41:48 浏览: 45
以下是一种C++实现方式:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 8; // 矩阵大小
const int M = 4; // 方阵大小
int a[N][N]; // 存储矩阵
int f[N][N][M][M]; // 记忆化数组
// 计算从(x,y)开始的m*n方阵的数字和
int sum(int x, int y, int m, int n) {
int res = 0;
for (int i = x; i < x + m; i++) {
for (int j = y; j < y + n; j++) {
res += a[i][j];
}
}
return res;
}
// 递归搜索
int dfs(int x, int y, int m, int n) {
if (f[x][y][m][n] != -1) return f[x][y][m][n]; // 已经计算过,直接返回
if (m == M && n == M) return f[x][y][m][n] = sum(x, y, m, n); // 已经找到4*4方阵,返回数字和
if (x + m > N || y + n > N) return f[x][y][m][n] = 1e9; // 越界,返回一个极大值
f[x][y][m][n] = 1e9; // 初始化为一个极大值
// 尝试往右或往下延伸
f[x][y][m][n] = min(f[x][y][m][n], dfs(x, y, m+1, n) + sum(x+m, y, 1, n));
f[x][y][m][n] = min(f[x][y][m][n], dfs(x, y, m, n+1) + sum(x, y+n, m, 1));
return f[x][y][m][n];
}
int main() {
// 读入矩阵
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> a[i][j];
}
}
// 初始化记忆化数组
memset(f, -1, sizeof(f));
// 从每个位置开始搜索
int ans = 1e9;
for (int i = 0; i <= N-M; i++) {
for (int j = 0; j <= N-M; j++) {
ans = min(ans, dfs(i, j, 1, 1));
}
}
cout << ans << endl;
return 0;
}
```
该算法的时间复杂度为$O(N^6)$,可以通过本题。