题解 | #最大子矩阵#

最大子矩阵

http://www.nowcoder.com/practice/a5a0b05f0505406ca837a3a76a5419b3

#include<iostream>

using namespace std;
const int MAXN = 110;

int DP(int a[],int n){//对一个序列求最大子序列
    int dp[MAXN] = {0}, maxResult = -1e9;
    for(int i = 1; i <= n; i++){
        dp[i] = max(dp[i-1]+a[i],a[i]);
        maxResult = max(dp[i],maxResult);
    }

    return maxResult;
}

int main(){
    int n,a[MAXN][MAXN] = {0},S[MAXN];
    while(cin >> n){
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                cin>>a[i][j];
        int maxResult = -1e9;
        for(int i = 1; i <= n; i++){
            int S[MAXN][MAXN] = {0}; //每次新一行开一个新矩阵
            for(int j = i; j <= n; j++){
                for(int k = 0; k <= n; k++){
                    S[j][k] = S[j-1][k] + a[j][k];
                    maxResult = max(maxResult,DP(S[j],n));//i到j行之和的子序列寻找最大序列
                }
            }
        }
        cout<<maxResult<<endl;
    }

    return 0;
}

对于一个矩阵,可以将其转换成一个序列,然后求最大子序列。
具体方法是:
(1)取第i行到第j行之间的元素“拍扁”成一行就成了一个序列。
(2)对这个序列求最大子序列,就得到i行到j行之间可能的最大子矩阵。
(3)遍历所有可能的i和j,就可以得到整个矩阵的最大子矩阵。
要注意在i行到j行“排扁”的过程中可以利用i行到j-1行拍扁的结果:

S[j][k] = S[j-1][k]+a[j][k];

时间复杂度

全部评论

相关推荐

07-02 18:09
门头沟学院 Java
苍穹外卖和谷粒商城这俩是不是烂大街了,还能做吗?
想去重庆的鸽子在吐槽:你不如把这俩做完自己搞明白再优化点再来问 何必贩卖焦虑
点赞 评论 收藏
分享
07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务