给定一个整数 n n n ,代表的是方形区间的边长,之后再输入所有格子内的数。 求该区间内的最大子区间的和。
暴力要搞到 O ( n 4 ) O(n^4) O(n4)。考虑一下降维和动归。 正常动归,要用到二维动态规划,可能会超时。
这里可以将每一列的前缀和算出来,即把每一列当作一个数,在确定好上下界之后,就可以用一维动归来解决这个问题了。 算法的时间复杂度就降到了 O ( n 3 ) O(n^3) O(n3)
在做一维动归的时候,需要一些贪心思想。 遍历到第 k k k 个数时,如果前面 [ 1 , k − 1 ] [1,k-1] [1,k−1] 个数的总和 l a s t _ s u m ≤ 0 last\_sum\leq 0 last_sum≤0,那么说明我们可以将这第 k k k 个数当作一个新的区间的开始。假设还加进 l a s t _ s u m last\_sum last_sum 的话,此时 l a s t _ s u m + a [ k ] ≤ a [ k ] last\_sum+a[k]\leq a[k] last_sum+a[k]≤a[k],则这个情况一定不是最优的,所以可以摒弃 l a s t _ s u m last\_sum last_sum。