说起来惭愧,学了这么久动态规划,还不会求最大子矩阵~
要学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我调了好久~~