一本通1224 最大子矩阵(动态规划)

1224 最大子矩阵
【题目描述】已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1×1)子矩阵。比如,如下4×4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是
9 2
-4 1
-1 8
这个子矩阵的大小是15。
【输入】输入是一个N×N的矩阵。输入的第一行给出N(0<N≤100)N(0<N≤100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N^2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[−127,127]。
【输出】输出最大子矩阵的大小。【输入样例】
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
【输出样例】15

本题方法参考另一博客的思路,多谢这位大神。
https://blog.csdn.net/sdau164185/article/details/70215710

个人理解思路:
分析:本道题目因为不能采用局部最优解组成整体最优解(因为有可能出现现在的减小造就之后的增大的情况…)所以不能直接用贪心,采用动态规划。

思路概要:
1、将二维数组变一维数组,枚举起始行和重点行,比如n=3,则有1-1,1-2,1-3,2-2,2-3,3-3这六种情况。
2、计算每一次枚举出的这几行的各列之和,形成一维数组b
3、在每次求的b数组中求这一数组的最大子序列,演变为求最大子序列问题。

注意:
1、初始化b数组的时机,每一次初始行改变的时候才会对b数组进行初始化,在初始行不变只有结束行变动的时候,只要将整个数组的每一个元素加上这一新增行的值即可。
2、在求最大子序列的时候,在本题中的代码为:
for(int k=1;k<=n;k++)//求最大子序列的方法
{
if(sum_zi>0)
sum_zi+=b[k];
else
sum_zi=b[k];//只要有正的加上之后就会变大!!
if(sum_zi>max)
max=sum_zi;//记录结果,出现更大的结果就记下来。
}

max在这里是记录的整道题的最大值。(因为本道题只要求值)

枚举例子:
在这里插入图片描述

代码:

#include<iostream>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值