注意是第一行和最后一行连起来,第一列和最后一列连起来,一开始一直以为只有列连起来。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=300;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define ss(x) scanf("%d",&x)
int map[maxn][maxn],h[maxn];
int main()
{
int t;
ss(t);
while(t--)
{
int n;ss(n);
int maxsum=-100000000;
rep(i,1,n) rep(j,1,n) {ss(map[i][j]);map[i][j+n]=map[i+n][j]=map[i+n][j+n]=map[i][j];}
rep(i,1,n+n) rep(j,i,n+i-1) {
rep(k,1,n+n) {
h[k]=(i==j)?map[j][k]:h[k]+map[j][k];
}
rep(k,1,n){
int sum=0;
rep(p,k,k+n-1){
if(sum>=0) sum+=h[p];
else sum=h[p];
maxsum=max(maxsum,sum);
}
}
}
cout<<maxsum<<endl;
}
return 0;
}

本文介绍了一个解决二维矩阵中寻找最大子数组和的问题,通过动态规划的方法实现了高效的求解算法。该算法不仅考虑了矩阵内部的子数组,还考虑了边缘情况,即第一行与最后一行相连、第一列与最后一列相连的情况。
1205

被折叠的 条评论
为什么被折叠?



