题目描述
牛牛和 15 个朋友来玩打土豪分田地的游戏,牛牛决定让你来分田地,地主的田地可以看成是一个矩形,每个位置有一个价值。分割田地的方法是横竖各切三刀,分成 16 份,作为领导干部,牛牛总是会选择其中总价值最小的一份田地, 作为牛牛最好的朋友,你希望牛牛取得的田地的价值和尽可能大,你知道这个值最大可以是多少吗?
输入描述:
每个输入包含 1 个测试用例。每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 75),表示田地的大小,接下来的 n 行,每行包含 m 个 0-9 之间的数字,表示每块位置的价值。
输出描述:
输出一行表示牛牛所能取得的最大的价值。
算法思路
分析题目,题目的目的其实就是把田地分为16分,怎样分使16份中最小的一块田地最大。如果单用暴力的方法来求解,要列举所有的分割方法,然后计算其中最小的田地大小,可见复杂度之大。
换个角度思考,通过二分法来求得最小的田地(最大)的情况下的大小,l=0,r=sum[n][m],其中sum[i][j]表示的是从左上方框到ij方框的田地的大小。接下来开始二分查找,先暴力列举出所有竖切的可能性,然后开始横切,每切一刀前,判断如果每一刀横切所得的四个矩形的大小大于mid,则继续在此基础上横切,否则退出该种可能,调整l和r的空间,不断缩小空间(注意既然mid是最小田地的大小,则就应该满足每一块田地的大小要大于等于mid)。
代码:
package net.stxy.one.controller; /** * Created by ASU