#include <bits/stdc++.h>
using namespace std;
const int N = 10;
int n = 8, k, a[N][N], s[N][N], mem[N][N][N][N][20];
inline void init() {
for (int i = 1; i <= n; i++)
s[1][i] = s[1][i - 1] + a[1][i];
for (int i = 1; i <= n; i++)
s[i][1] = s[i - 1][1] + a[i][1];
for (int i = 2; i <= n; i++) for (int j = 2; j <= n; j++)
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
}
inline int calc(int lx, int ly, int rx, int ry) {
return s[rx][ry] - s[lx - 1][ry] - s[rx][ly - 1] + s[lx - 1][ly - 1];
}
inline int dfs(int lx, int ly, int rx, int ry, int cnt) {
if (mem[lx][ly][rx][ry][cnt] != -1)
return mem[lx][ly][rx][ry][cnt];
if (cnt == k)
return calc(lx, ly, rx, ry) * calc(lx, ly, rx, ry);
int sum = 1 << 30, minn = 1 << 30, ty;
for (int i = ly; i < ry; i++) if (2 * calc(lx, ly, rx, i) * calc(lx, i + 1, rx, ry) < minn) {
minn = 2 * calc(lx, ly, rx, i) * calc(lx, i + 1, rx, ry);
ty = i;
}
sum = min(sum, min(dfs(lx, ly, rx, ty, cnt + 1) + calc(lx, ty + 1, rx, ry) * calc(lx, ty + 1, rx, ry), dfs(lx, ty + 1, rx, ry, cnt + 1) + calc(lx, ly, rx, ty) * calc(lx, ly, rx, ty)));
minn = 1 << 30;
for (int i = lx; i < rx; i++) if (2 * calc(lx, ly, i, ry) * calc(i + 1, ly, rx, ry) < minn) {
minn = 2 * calc(lx, ly, i, ry) * calc(i + 1, ly, rx, ry);
ty = i;
}
sum = min(sum, min(dfs(lx, ly, ty, ry, cnt + 1) + calc(ty + 1, ly, rx, ry) * calc(ty + 1, ly, rx, ry), dfs(ty + 1, ly, rx, ry, cnt + 1) + calc(lx, ly, ty, ry) * calc(lx, ly, ty, ry)));
// printf("%d %d %d %d %d\n", lx, ly, rx, ry, sum);
mem[lx][ly][rx][ry][cnt] = sum;
return sum;
}
int main() {
memset(mem, 255, sizeof(mem));
scanf("%d", &k);
for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++)
scanf("%d", &a[i][j]);
init();
printf("%d\n", dfs(1, 1, n, n, 1));
return 0;
}
我 不需要《代码食粮》(已过) 只需《精神食粮》