51nod 1051 求最大子矩阵和

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1051

1051 最大子矩阵和

基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题

一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。

例如:3*3的矩阵:

-1 3 -1

2 -1 3

-3 1 2

和最大的子矩阵是:

3 -1

-1 3

1 2

Input

第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。
第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)

Output

输出和的最大值。如果所有数都是负数,就输出0。

Input示例

3 3
-1 3 -1
2 -1 3
-3 1 2

Output示例

7

思路:转换为最大子序列的和,遍历空间的整个状态。

AC代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define ll long long
const int maxn=5e2+5;
const int INF=0x3f3f3f3f;

int mp[maxn][maxn];
ll dp[maxn];

int main()
{
    int N,M;
    while(scanf("%d%d",&M,&N)==2)
    {
        for(int i=1; i<=N; i++)
            for(int j=1; j<=M; j++)
                scanf("%d",&mp[i][j]);
        ll ans=-INF;
        for(int i=1; i<=N; i++)
        {
            memset(dp,0,sizeof(dp));
            for(int j=i; j<=N; j++)
            {
                for(int k=1; k<=M; k++)
                    dp[k]+=mp[j][k];
                ll num=-INF;
                for(int i=1; i<=M; i++)
                {
                    num=max(num+dp[i],dp[i]);
                    ans=max(num,ans);
                }
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
时间: 2024-10-13 19:10:20

51nod 1051 求最大子矩阵和的相关文章

51Nod - 1051 最大子矩阵和

51Nod - 1051 最大子矩阵和 一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如:3*3的矩阵: -1 3 -1 2 -1 3 -3 1 2 和最大的子矩阵是: 3 -1 -1 3 1 2 Input 第1行:M和N,中间用空格隔开(2 <= M,N <= 500). 第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开.(-10^9 <= M[i] <= 10^9) Output 输出和的最大值.如果所有数都

51nod 1051 最大子矩阵和(dp)

题目链接:51nod 1051 最大子矩阵和 实质是把最大子段和扩展到二维.读题注意m,n... 1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<algorithm> 5 #define CLR(a,b) memset((a),(b),sizeof((a))) 6 using namespace std; 7 const int N = 501; 8 int dp[N]

HDOJ To The Max 1081【动态规划-详解求最大子矩阵】

To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 9879    Accepted Submission(s): 4762 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectan

BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减

数据结构--单调栈--求最大子矩阵的大小

求最大子矩阵的大小给定一个整型矩阵map, 其中的值只有0和1两种, 求其中全是1的所有矩形区域中, 最大的矩形区域为1的数量.例如:1 1 1 0其中, 最大的矩形区域有3个1, 所以返回3.再如:1 0 1 11 1 1 11 1 1 0其中, 最大的矩形区域有6个1, 所以返回6. 解:将其放到一个矩阵中,同时从第0行开始计算,以该行打底时,直方图的最大面积 如第0行,数组为[1, 0, 1, 1] 此时按照下面的求直方图最大面积. 然后以第1行打底,此时数组为[2, 1, 2, 2],同

栈和队列----求最大子矩阵的大小

求最大子矩阵的大小 给定一个整型矩阵map,其中的值只有0,1两种,求全是1 的所有矩阵区域中,最大的矩形区域为1的数量. 例如: 1  1  1  0,其中最大的矩形区域有3个1,所以返回3 例如: 1  0  1  1 1  1  1  1 1  1  1  0 其中,最大的矩形区域有6个1,所以返回6 [解析] 首先,矩阵的行数为N,以每一行作为分割,统计以当前行作为底的情况下,每个位置往上的1 的数量,使用高度数组 height 来表示. 其次,对于每一次分割,都利用更新后的height

结对开发二——求矩阵子矩阵和的最大

一.开发思路 先设计一个3行4列的矩阵. 然后将12行的每一列相加作为第4行. 将23行的每一列相加作为第5行. 将123行的每一列作为第六行. 然后列出每一行的子数组求出最大值. 最后比较每一行的最大值的大小,求出最终结果. 二.开发代码 #include<iostream.h>int main(){int x,y,n,m;int s[10][20];// int a[10][20];int sum[10][20];cout<<"请输入3行4列的矩阵:"<

环形二维数组求最大子矩阵

1.设计思路 结合环一位数组的开发经验,拓展到二维.与前者主要是时间复杂度没有做处理. 2.源代码 1 //作者:王炳午.董龙洋.日期:2015.3.24. 2 #include <iostream> 3 #include<stdlib.h> 4 #include<time.h> 5 using namespace std; 6 int maxMax(int amax[]) //求最大 7 { 8 int i; 9 int sum = 0; 10 int max; 11

首尾相接二维数组(圆柱)--求最大子矩阵

一 题目:一个首尾相接的二维数组,其中有有正数,有负数,求它的最大子矩阵. 二 设计思路: 这道题基本无难度,因为这道题可以参考以前做过的求解二维数组的子矩阵(不是首尾相接),所以可以简单划分为两部分.第一步先将它化为一维首尾相接的数组(环),然后再利用求解环中最大子数组的思想求解.具体将二维数组化为一维数组请参考(http://www.cnblogs.com/houtaoliang/p/4401630.html),在此只简单分析求解环的最大子数组. 求解环的最大子数组可分为两种情况.第一种:当