请求该测试点+撤下错误题解
查看原帖
请求该测试点+撤下错误题解
678447
CSPAK_Zhangxiuqi0011楼主2023/12/23 10:33

本题本人在做的时候一开始是找到第一个有正值的列开始走,边走边求最大值(语文不好描述不太清楚,具体看代码吧):

#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;
}

但是两份代码都过了
数据我不怎么会出,就不出了
如果本蒟蒻对这两个思路理解有误请大佬指出

2023/12/23 10:33
加载中...