膜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\n",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\n",maxx); } return 0; }