膜sen爷爷:
题意:给你一个n*m的矩阵(1<=n,m<=1000)但是其中的正数最多100个其余的全是0,
让你求子矩阵最大的边界和
由于没有oj判题,自己写了一个代码就放在这里了,望大家检查
代码:
让你求子矩阵最大的边界和
由于没有oj判题,自己写了一个代码就放在这里了,望大家检查
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int maxv = 105;
const int inf = 0x3f3f3f3f;
int Map[maxn][maxn],Map1[maxv][maxv];
int h[maxv][maxv],l[maxv][maxv];
int n,m;
int pos1,pos2;
int vh[maxn],vl[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vh,0,sizeof(vh));
memset(vl,0,sizeof(vl));
scanf("%d %d",&n,&m);
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
scanf("%d",&Map[i][j]);
if(Map[i][j]){
vh[i] = 1;
vl[j] = 1;
}
}
}
pos1 = 0;
for(int i = 1;i<=n;i++){
if(vh[i]){
pos1 ++;
pos2 = 0;
for(int j = 1;j<=m;j++){
if(vl[j]){
pos2++;
Map1[pos1][pos2] = Map[i][j];
}
}
}
}
for(int i = 1;i<=pos1;i++){
for(int j = 1;j<=pos2;j++){
h[i][j] = h[i][j-1] + Map1[i][j];
l[i][j] = l[i-1][j] + Map1[i][j];
}
}
int maxx = -inf;
for (int i = 1;i<=pos1;i++){
for (int j = i;j<=pos1;j++){
int maxl = 0;
for (int k = 1;k<=pos2;k++){
int sum = maxl + l[j][k] - l[i-1][k];
if(sum > maxx){
maxx = sum;
}
if(k == 1){
maxl = l[j][k] - l[i-1][k];
} else if(i == j)
{
maxl = max(maxl + Map1[i][k],maxl);
} else {
maxl = max(maxl + Map1[i][k] + Map1[j][k], l[j][k] - l[i-1][k]);
}
}
}
}printf("%d
",maxx);
}
return 0;
}
最大子矩阵的总和:代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int maxv = 105;
const int inf = 0x3f3f3f3f;
int Map[maxn][maxn],Map1[maxv][maxv];
int h[maxv],l[maxv];
int per[maxv][maxv];
int pos1,pos2;
int n,m;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(h,0,sizeof(h));
memset(l,0,sizeof(l));
scanf("%d%d",&n,&m);
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
scanf("%d",&Map[i][j]);
if(Map[i][j]){
h[i] = 1;
l[j] = 1;
}
}
}
pos1 = 0;
for(int i = 1;i<=n;i++){
if(h[i]){
pos1 ++;
pos2 = 0;
for(int j = 1;j<=m;j++){
if(l[j]){
pos2 ++;
Map1[pos1][pos2] = Map[i][j];
}
}
}
}
for(int i = 1;i<=pos1;i++){
for(int j = 1;j<=pos2;j++){
per[i][j] = per[i-1][j] + per[i][j-1] - per[i-1][j-1] + Map1[i][j];
}
}
int maxx = -inf;
for(int i = 1;i<=pos1;i++){
for(int j = i;j<=pos2;j++){
int sum = 0;
for(int k = 1;k<=pos2;k++){
int temp = per[j][k] - per[j][k-1] - per[i-1][k] + per[i-1][k-1];
if(sum > 0){
sum += temp;
} else {
sum = temp;
}
if(sum > maxx){
maxx = sum;
}
}
}
}printf("%d
",maxx);
}
return 0;
}