2 条题解
-
0
方法二:
#include<bits/stdc++.h> using namespace std; int n; int a[105][105]; int ans; int mx = -1e9; int main() { cin >> n; for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { cin >> a[i][j]; //取所有数字最大值,防止矩阵都是负数的情况 mx = max(mx, a[i][j]); a[i][j] += a[i][j - 1]; //求前缀和,方便计算一段元素的和 } } for(int i = 0; i < n; i++) {//枚举子矩阵起始列 for(int j = i + 1; j <= n; j++) {//枚举子矩阵终止列 int sum = 0;//和 for(int k = 1; k <= n; k++) {//枚举行 sum += a[k][j] - a[k][i];//加入第k行的和 if (sum < 0) sum = 0;//贪心,如果没有贡献,清零 ans = max(ans, sum);//求最大值 } } } if (ans == 0) {//如果最大值为0,有可能全部元素都小于0,结果是空矩阵 cout << mx;//输出矩阵元素最大值 } else {//否则,输出答案 cout << ans; } return 0; } -
0
#include <bits/stdc++.h> using namespace std; #define N 1001 using namespace std; int a[N][N],f[N]; int maxArray(int t[],int n) { int sum=0,maxx=INT_MIN; for(int i=1;i<=n;i++) { if(sum>0) sum+=t[i]; else sum=t[i]; if(sum>maxx) maxx=sum; } return maxx; } int main() { int n; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; int maxx=INT_MIN; for(int i=1;i<=n;i++) { memset(f,0,sizeof(f)); for(int j=i;j<=n;j++) { for(int k=1;k<=n;k++) f[k]+=a[j][k]; int temp=maxArray(f,n); if(temp>maxx) maxx=temp; } } cout<<maxx<<endl; return 0; }
- 1
信息
- ID
- 760
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 12
- 已通过
- 5
- 上传者