记忆化搜索。一眼题不解释。
感觉这道题不值得我写博客。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
#define rep(i,j,k) for(i=j;i<=k;++i)
#define per(i,j,k) for(i=j;i>=k;--i)
#define sqr(x) ((x)*(x))
#define G getchar()
#define LL long long
#define pii pair<int,int>
#define mkp make_pair
#define X first
#define Y second
#define N 501
#define NN 1005
#define inf 1061109567
int a[9][9],f[15][9][9][9][9];
int read(){
int x=0;char ch=G;
while(ch<48||ch>57)ch=G;
for(;ch>47&&ch<58;ch=G)x=x*10+ch-48;
return x;
}
void solve(int k,int U,int D,int L,int R){
int i,j,&x=f[k][U][D][L][R];
if(x<inf||D-U+R-L<k)return;
if(!k){
int sum=0;
rep(i,U,D)rep(j,L,R)sum+=a[i][j];
x=sqr(sum);
return;
}
rep(i,U,D-1){
solve(k-1,U,i,L,R);solve(0,i+1,D,L,R);solve(0,U,i,L,R);solve(k-1,i+1,D,L,R);
x=min(x,min(f[k-1][U][i][L][R]+f[0][i+1][D][L][R],f[0][U][i][L][R]+f[k-1][i+1][D][L][R]));
}
rep(i,L,R-1){
solve(k-1,U,D,L,i);solve(0,U,D,i+1,R);solve(0,U,D,L,i);solve(k-1,U,D,i+1,R);
x=min(x,min(f[k-1][U][D][L][i]+f[0][U][D][i+1][R],f[0][U][D][L][i]+f[k-1][U][D][i+1][R]));
}
}
int main(){
int n=read()-1,i,j;
rep(i,1,8)rep(j,1,8)a[i][j]=read();
memset(f,63,sizeof f);
solve(n,1,8,1,8);
printf("%d\n",f[n][1][8][1][8]);
return 0;
}