最大子矩阵(最大子段和)

说起来惭愧,学了这么久动态规划,还不会求最大子矩阵~

要学o(n^3)的求法,首先要弄懂o(n)的最大子段和,因为子段可以看做一维子矩阵。

对于最大子段和,每一位置j,前j-1个位置的最大子段和我们都已求出,至于后续的位置,对于当前位置并无影响,而且,子段和必须连续,所以我们只需考虑两种情况

1、以该位置为起点,f[j]:=a[j];

2、并入前字段和,f[j]:=f[j-1]+a[j];

我们只要在这两种情况取最大值,便可得出递推式。

另外,如果不需求出每一位置的最大子段和,我们还可以进行空间优化(参见程序中max部分)

回到子矩阵问题,如果我们已知最上界和最下界,无疑由于必须连续的原因,上下界之间不会断层,因此,算出每一列上下界之间权值和,就可以转化为求最大子段和的问题,枚上下界复杂度为o(n^2),求子段和复杂度为o(n),总复杂度o(n^3)。

程序题目来自poj1050

多说一句,我第一次看见一行读入矩阵的,那个readln我调了好久~~

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值