最大子阵和

hoj2558,给定一个矩阵,返回最大的子矩阵的和。

思路(动态规划):

1.读入矩阵的同时计算部分和矩阵

2.枚举矩阵的行上下边界,固定了行上下边界后,

根据部分和矩阵在O(1)时间内得到同一列元素的和,转化为1维数组的情况

3.按照一维数组的情况,求最大子数组和的思路是:

可以从后往前计算,每次先算以当前元素A[i]为开头的最大和start

再将start与当前A[i+1:n]所代表的真实最大和进行比较,作为A[i:n]的真实最大和保存起来。

4.输出遍历过程中得到的最大值MAX即可

cpp代码:

#include<iostream>
#define SIZE 102
#define INF 1000
using namespace std;
int maxx(int a,int b){
    return a>b?a:b;
}
int main(){
    int n,i,j,k,a,c,tmp,MAX,start,all;
    int num[SIZE];
    int mat[SIZE][SIZE];
    while(cin>>n){
        //读入矩阵的同时计算部分和矩阵
        for(j=0;j<=n;j++)mat[0][j]=mat[j][0]=0;
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                cin>>mat[i][j];
                mat[i][j]+=mat[i-1][j];//累积部分和
            }
        }
        //开始处理
        MAX=-INF;
        for(a=1;a<=n;a++){
            for(c=a;c<=n;c++){//枚举上下边界
                start=mat[c][n]-mat[a-1][n];
                all=start;//先给数组最后一个元素赋值
                for(k=n-1;k>=1;k--){//从后往前计算
                    tmp=mat[c][k]-mat[a-1][k];//根据部分和算出当前元素值
                    start=maxx(tmp+start,tmp);//先比较以tmp开头的
                    all=maxx(start,all);//再比较总的
                }
                if(all>MAX)MAX=all;
            }
        }
        cout<<MAX<<endl;
    }
    return 0;
}
时间: 2024-10-12 11:30:29

最大子阵和的相关文章

蓝桥杯 历届试题 最大子阵

历届试题 最大子阵 时间限制:1.0s   内存限制:256.0MB 问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数. 接下来n行,每行m个整数,表示矩阵A. 输出格式 输出一行,包含一个整数,表示A中最大的子矩阵中的元素和. 样例输入 3 3-1 -4 33 4 -1-5 -2 8 样例输出 10 样例说明 取最后一列,和为10. 数据规

算法笔记_176:历届试题 最大子阵(Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数. 接下来n行,每行m个整数,表示矩阵A. 输出格式 输出一行,包含一个整数,表示A中最大的子矩阵中的元素和. 样例输入 3 3-1 -4 33 4 -1-5 -2 8 样例输出 10 样例说明 取最后一列,和为10. 数据规模和约定 对于50

历届试题 最大子阵

问题描述 给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大. 其中,A的子矩阵指在A中行和列均连续的一块. 输入格式 输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数. 接下来n行,每行m个整数,表示矩阵A. 输出格式 输出一行,包含一个整数,表示A中最大的子矩阵中的元素和. 样例输入 3 3-1 -4 33 4 -1-5 -2 8 样例输出 10 样例说明 取最后一列,和为10. 数据规模和约定 对于50%的数据,1<=n, m<=50: 对于100%的

算法-蓝桥杯习题(七)

蓝桥杯习题 蓝桥杯练习系统习题加答案,总共分为6部分,90%习题使用C语言解答,部分使用C++或者Java.大部分习题为搜索参考或者别人提供所得,不足之处在所难免,恳请批评指正(预计200多题,习题仅供学习交流) 目录 算法训练(详见 算法-蓝桥杯习题(一))Go 算法训练(详见 算法-蓝桥杯习题(二))Go 算法提高(waiting...) 历届试题(详见 算法-蓝桥杯习题(六))Go 历届试题(详见 算法-蓝桥杯习题(七))Go 蓝桥杯练习系统评测数据 链接: http://pan.baid

蓝桥杯 历届试题 题目总结

后天就是蓝桥杯省赛了,今天总结一下这段时间做的蓝桥杯历届试题,还是一个一个题目的来吧!!!!!! 1,历届试题 矩阵翻硬币 这个题目说真的,我不会,在网上看了某神牛的题解答案为 ans=sqrt(n)*sqrt(m),具体怎么证明的我也不知道 2,历届试题 兰顿蚂蚁 这个题目怎么说呢,应该是送分题,直接模拟就可以了,这里就不说了. 3, 历届试题 分糖果 这个题目好像之前在哪里做过,也是一道模拟题,弄两个数组搞一下就可以了 下面是代码 #include<bits/stdc++.h> using

基础算法学习2-dp

一.算法题: 最大子阵 给定一个n×m 的矩阵 A,求A 中的一个非空子矩阵,使这个子矩阵中的元素和最大.其中,A 的子矩阵指在 A 中行和列均连续的一部分.输入格式输入的第一行包含两个整数 n,m(1≤n,m≤50),分别表示矩阵 A 的行数和列数.接下来 n 行,每行 m 个整数,表示矩阵 A(?1000≤i,j≤1000).输出格式输出一行,包含一个整数,表示 A 中最大子矩阵的元素和.样例输入3 32 -4 1-1 2 14 -2 2样例输出6 二.解题代码: 1 #include <i

计蒜客 《程序设计竞赛体验课程》第一部分 快速提升代码能力

这一部分内容比较简单 直接把代码发上来 不想自己写的同学可以直接抱走~ 练习题:a+b 问题 #include<bits/stdc++.h> using namespace std; int main() { int n,x,y; cin>>n; while(n--) { cin>>x>>y; cout<<x+y<<endl; } } 练习题:斐波那契数列 #include<bits/stdc++.h> using nam

软件工程课程作业(四)--返回一个整数数组中最大子数组的和

伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思想 本实验要求输入一个正负数混合的整型数组,长度不限,在此数组的所有子数组中找到和最大的数组,并求出相应数组的和,且时间复杂度为O(n).我们在课堂上共同讨论了多种解决方案,这些将在下面可能的解决方案中展示,在听了同学的思路和老师的讲解之后, 我们最终选取了老师课堂上描述的比较简便的思路.如下: 在输入数组的环节,采用for无限循环加if判断截止,直到触发回车键为止,将数组记录到Array中,数组长度记录

lincode.41 最大子数组

最大子数组 描述 笔记 数据 评测 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 注意事项 子数组最少包含一个数 您在真实的面试中是否遇到过这个题? Yes 哪家公司问你的这个题? Airbnb Amazon LinkedIn Cryptic Studios Dropbox Apple Epic Systems TinyCo Yelp Hedvig Zenefits Uber Snapchat Yahoo Microsoft Bloomberg Facebook Google T