环状矩阵求最大子矩阵和

在这里插入图片描述

 

#include<bits/stdc++.h>
using namespace std;
#define NIL 1e9
long long a[405][405],pre[405][405];
int main()
{
	long long n,m,ans = -NIL,sum,t=0;

	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		for(int j = 0;j < m;j++){   //由于列下标形成环状要取模,所以列下标从0开始
			cin >> a[i][j];
			ans = max(ans,a[i][j]);
		}
	}

	if(ans <= 0) cout << ans << endl;
	else{
		for(int i = 1; i <= n; ++i){
            for(int j  = 0; j < m;++j){
                pre[i][j] = pre[i-1][j] + a[i][j];
            }
		}

		for(int i = 1;i <= n; ++i){  //上
            for(int j = i;j <= n; ++j){  //下
                for(int left = 0; left < m; ++left){  //左
                    sum = 0;
                    /*列始终以及环状进行考虑
                    行分为两种情况,一是正常矩阵,二是上界在下界下方,即行形成环状*/

                    for(int right = 0; right < m; ++right){  //右

                        //上界不超过下界
                        if(i <= j){
                            t = pre[j][(left+right)% m] - pre[i-1][(left+right)% m];
                        }
                        //行形成环状 整个pre一坨减去上界上方一坨再加上包括下界以上的一坨
                        else{
                            t = pre[n][(left+right)% m] - pre[i-1][(left+right)% m] + pre[j][(left+right)% m];
                        }
                        if(t + sum <= 0) sum = 0;
                        else sum += t;
                        ans = max(ans,sum);
                    }

                }
            }
		}
		cout << ans << endl;
	}
	return 0;
}
/*
3 3
1 -2 3
-4 5 -6
7 -8 9
答案:20
*/

说明:没跑成功,思路是对的,待改正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值