nyoj 104——最大和——————【子矩阵最大和】

最大和

时间限制:1000 ms  |  内存限制:65535 KB

难度:5

描述

给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。 
例子:
0 -2 -7 0 
9 2 -6 2 
-4 1 -4 1 
-1 8 0 -2 
其最大子矩阵为:

9 2 
-4 1 
-1 8 
其元素总和为15。

输入
第一行输入一个整数n(0<n<=100),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数;
输出
输出矩阵的最大子矩阵的元素之和。
样例输入
1
4 4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
样例输出
15

解题思路:这是一个很基本的模型。求矩阵的最大子矩阵和。这个在最大字段和的基础上,通过暴力枚举x*m大小的子矩阵(将子矩阵化成一行的形式,即求列的前缀和),再套用求子段和的方法,最后得到的就是结果。
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
const int INF=1e9;
int a[maxn][maxn];
int pref_sum[maxn];
int n,m;
int MaxSubSegSum(){ //最大子段和
    int ret=-INF,tmp=0;
    for(int i=0;i<m;i++){
        if(tmp<0){
            tmp=pref_sum[i];
        }else{
            tmp+=pref_sum[i];
        }
        if(tmp>ret){
            ret=tmp;
        }
    }
    return ret;
}
int main(){
    int t,i,j,k;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++){
            for(j=0;j<m;j++){
                scanf("%d",&a[i][j]);
            }
        }
        int ans=-INF;
        for(i=0;i<n;i++){   //枚举子矩阵第一行位置
            memset(pref_sum,0,sizeof(pref_sum));
            for(j=i;j<n;j++){   //枚举子矩阵行数
                for(k=0;k<m;k++){
                    pref_sum[k]+=a[j][k];
                }
                int tmp=MaxSubSegSum();
                if(tmp>ans)
                    ans=tmp;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

  

时间: 2024-10-25 20:55:56

nyoj 104——最大和——————【子矩阵最大和】的相关文章

结对开发——求二维环形数组所有子矩阵最大和的问题

一.题目要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值. 要求时间复杂度为O(n)题目:返回一个二维整数数组中最大子数组的和. 二.解决思路: 由于上次我们做过求二维数组最大子矩阵和的问题,又做了求一维环状数组的子数组最大值问题,这次就在以前的基础上进行修改,先对二维数组进行了重构,形成一个环状二维数组,然后再用求二维数组子矩阵最大和的方法求得最终结果.

HDU 1559 最大子矩阵--dp--(最大和子矩阵模型)

题意:给定一个矩阵,求一个宽为a,长为b的子矩阵的最大和 分析:直接用最大和子矩阵的公式,只是这里多了一个限制条件,所以在求和的时候稍有点不同,就是不逐行和逐列求了而是每次以a,b为跨度来求 dp[k]=mt[i][k]+....+mt[i+a][k],然后每次求sum=dp[k]+.....+dp[k+b],mx=max(mx,sum) 代码: #include<iostream> #include<cstring> using namespace std; int m,n,a,

代码题(35)— 最大和子矩阵

1.最大和子矩阵 问题:求一个M*N的矩阵的最大子矩阵和.比如在如下这个矩阵中:0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2 拥有最大和的子矩阵为:9 2-4 1-1 8其和为15. 假定原始矩阵的行数为M,那么对于子矩阵,它的行数可以是1到M的任何一个数,而且,对于一个K行(K < M)的子矩阵,它的第一行可以是原始矩阵的第1行到 M - K + 1 的任意一行.同时对于每一个得到的子矩阵,假设这个子矩阵是 2 *k, 也就是说它只有两行,要找出最大子矩阵,我们要从左

nyoj 104 最大和 (二维最大字串和)

描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据: 每组测试数据: 第一行有两个的整数r,c(0<r,c<=100),r.c分别代表矩阵的行和列: 随后有r行,每行有c个整数:

nyoj 104 最大和

最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子:0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据:每组测试数据:第一行有两个的整数r,c(0<r,c&l

nyoj 104 最大和 【dp】

最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据: 每组测试数据: 第一行有两个的整数r,c(0<r,

NYOJ 104 最大子矩阵(二维DP)

最大和 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据: 每组测试数据: 第一行有两个的整数r,c(0<r,

一个矩阵的所有子矩阵最大和问题

Preface ??今天早上刷微博,看到LeetCode中国微博发了这样一条状态: ??已经好久没做题练练手了,于是想试试.LeetCode上,该题目的地址为:https://leetcode.com/problems/max-sum-of-sub-matrix-no-larger-than-k/ Analysis ??想了一上午,也没想出什么头绪.后来我看 LeetCode 上有不少人已经做出提交了.并且,在discuss页面里,有人公布了详细的解释与代码. ??我看了一下,他这个解法是基于K

最大子矩阵求和 NYOJ 104 &amp;&amp; 372 &amp;&amp; HDU 1081

链接:click here 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵. 例子: 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 其最大子矩阵为: 9 2 -4 1 -1 8 其元素总和为15. 输入 第一行输入一个整数n(0<n<=100),表示有n组测试数据: 每组测试数据: 第一行有两个的整数r,c(0<r,c<=100),r.c分别代表矩阵的行和列: 随后有