网上讲石油区域的方法很多,开始看的似懂非懂,看了很久才看懂。下面两个帖子对我帮助比较大:
http://blog.sina.com.cn/s/blog_86942b14010140l4.html
https://blog.csdn.net/Whjpji/article/details/7409632
通过第一个帖子,我看懂了六种场景及大体算法如何,但是代码不熟悉,又看了别的帖子,对于最后两种情况的中间部分如何计算,在第二个帖子中终于看懂了,在此记录下,供以后参考。
1、首先用sum二维数组记录以该点为右下角的矩形的石油总和,用于计算长度为k的方形的石油量。以该点左上方的方形的石油储量计算方法为:
2、对于前四种情况,分别计算该点左上方、右上方、左下方、右下方区域里,单块最大石油储量,这比较简单;如果是计算左上方,就从左上角[0][0]点,不断向右向下累计kv最大值即可;同理右上方计算方式为从右上角[0][n],不断向左向下累计最大值。
3、后两种情况,取最后一种为例,最上面其实是[i][0]右上方最大值(也可以是[i][n-1]左上方最大值),最下方区域是[i+k][0]有下发最大值,注意这里是i+k,因为中间区域只要只要留下k行即可,那么中间区域的最大值就好算了,可以放在一维数组里,[i+k]存储i到i+k行最大石油量,直接用左上方单块区域从左到右累计最大值即可,求左上方最大值的时候顺道就可以计算出来。同理case5,在j+k中存储j列到j+k列最大值,计算左上方值时,从上到下累计最大值即可。