51nod 1051 最大子矩阵和

51nod 1051 最大子矩阵和

可以用前缀和容斥优化到 \(O(n^4)\),但是不够进行如下图操作:

image

将每一列的数值都压缩到一维的数组上,就转换为求最大字段和问题,时间复杂度 \(O(n^3)\)

看看代码就知道了。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m; 
int a[505][505];
ll b[505];
 
int main(){
    ios::sync_with_stdio(false);
    cin>>m>>n;
    for(int i=1;i<=n;i++){
    	for(int j=1;j<=m;j++){
    		cin>>a[i][j];
		}
	}
	ll ans=INT_MIN;
	for(int l=1;l<=n;l++){
		memset(b,0,sizeof b);//起点变了,清零。
		for(int r=l;r<=n;r++){
			for(int k=1;k<=m;k++){//合并位一维数组
				b[k]+=a[r][k];
			}
			ll mx=INT_MIN;
			ll cmx=0; 
			for(int k=1;k<=m;k++){//最大字段和
				cmx=max(b[k],cmx+b[k]);
				mx=max(mx,cmx);
			}
			ans=max(ans,mx);
		}
	}
    if(ans<0){
    	cout<<0;
	}
	else{
		cout<<ans;
	}
    return 0;
}

posted @ 2024-09-09 20:08  sad_lin  阅读(4)  评论(0编辑  收藏  举报