本题本人在做的时候一开始是找到第一个有正值的列开始走,边走边求最大值(语文不好描述不太清楚,具体看代码吧):
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[105][20005];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int m,n;
cin>>m>>n;
for(int i = 1; i<=m; i++) {
for(int j = 1; j<=n; j++) {
cin>>a[i][j];
}
}
int ans,now;
ans = 0;
now = 0;
int st;
for(st = 1;;st++){
int f;
f = 1;
for(int i = 1;i<=m;i++){
if(a[i][st]>0){
f--;
break;
}
}
if(!f){
break;
}
}
for(int i = st; i<=n; i++) {
int maxn;
maxn = INT_MIN;
for(int j = 1; j<=m; j++) {
maxn = max(maxn,a[j][i]);
}
now = now+maxn;
ans = max(ans,now);
}
cout<<ans<<"\n";
return 0;
}
后来听老师讲思路发现使用最大子段和求:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int a[105][20005];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int m,n;
cin>>m>>n;
for(int i = 1; i<=m; i++) {
for(int j = 1; j<=n; j++) {
cin>>a[i][j];
}
}
int ans,now;
ans = 0;
now = 0;
for(int i = 1; i<=n; i++) {
int maxn;
maxn = INT_MIN;
for(int j = 1; j<=m; j++) {
maxn = max(maxn,a[j][i]);
}
now = max(maxn,now+maxn);
ans = max(ans,now);
}
cout<<ans<<"\n";
return 0;
}
但是两份代码都过了
数据我不怎么会出,就不出了
如果本蒟蒻对这两个思路理解有误请大佬指出