题目大意求最大子矩阵的和的变形。
最大子矩阵的求解由最大子序列和变形而来。
//
// Created by 王若璇 on 16/2/5.
//
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std;
const int max_n = 200;
const int inf = 0x3f3f3f3f;
int a[max_n][max_n];
int nLim;
/*max Sub sequence b[j] = max(b[j-1]+a[j],a[j])*/
int maxSubSequence(int array[],int n){
if(n==0){
return 0;
}
int maxAns = -inf;
int dp_MaxSub[max_n];
memset(dp_MaxSub,0,sizeof(dp_MaxSub));
dp_MaxSub[0] = array[0];
int before = 0;
for(int i = 1;i<n;i++){
if(dp_MaxSub[i-1]>0){
dp_MaxSub[i] = dp_MaxSub[i-1]+array[i];
} else{
dp_MaxSub[i] = array[i];
before = i;
}
if(maxAns<dp_MaxSub[i]){
maxAns = dp_MaxSub[i];
}
}
return maxAns;
}
/*void subMatrix(){
int total[max_n][max_n];
for(int i = 0;i<n;i++){
for(int j = 0;j<m;j++){
}
}
}*/
int subMaxMatrix(int matrix[][max_n],int n,int m){
int total[max_n][max_n];
memset(total,0,sizeof(total));
for(int i = 0;i<m;i++){
total[0][i] = matrix[0][i];
}
for(int i = 1;i<n;i++){
for(int j = 0;j<m;j++){
total[i][j]=total[i-1][j]+matrix[i][j];
}
}
int maximum = -inf;
for(int i = 0;i<nLim;i++){
for(int j = i;j<nLim+i;j++){
int subArray[max_n];
for (int k = 0; k < nLim; k++) {
for(int f = 0;f<nLim;f++){
if(i==0){
subArray[f] = total[j][f+k];
}else{
subArray[f] = total[j][f+k]-total[i-1][f+k];
}
}
int maximal = maxSubSequence(subArray,nLim);
// cout<<maximal<<" *";
maximum = max(maximal,maximum);
}
}
}
return maximum;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int T_case;
cin>>T_case;
while (T_case--){
cin>>nLim;
for(int i = 0;i<nLim;i++)
for(int j = 0;j<nLim;j++){
cin>>a[i][j];
a[i+nLim][j] = a[i][j+nLim] = a[i+nLim][j+nLim] = a[i][j];
}
int ans = subMaxMatrix(a,2*nLim,2*nLim);
cout<<ans<<endl;
}
}