noip导刊

NOIP模拟赛10月4日分析;Problem #1: 矩形分割(cut)简单题 题意简述 给出一个N*M的矩阵中N-1条横线和M-1条竖线的切割代价,求把矩形分割成1*1的小块的最小代价。 ;算法1:贪心 分析:每切一刀横刀,横的块数+1,则竖的每切一刀都要多算1的代价。 每切一刀竖刀,竖的块数+1,则横的每切一刀都要多算1的代价。 显然放在越前切的刀所需要的代价要少,而最终所有的刀都得被切到,将代价高的刀放在前面切自然更优。得到贪心算法,每次挑一条最大代价的分割线切下去。用队列实现。 1、分别将横切与竖切数据按从大到小的顺序形成有序队列; 2、设定双指针指向横竖队列队头; ; 3、比较两指针指向值,选择大的切,计算代价,下移指针; 4、直到某一队空为止,计算剩余的代价。 时间复杂度O(log(N))(贪心是线性时间,此复杂度为快排所需时间)。 算法2:DP 由于每条线必切,每切一条总是使块数加1,则将第I条横分割线和第J条横分割线上下对掉或将第I条竖分割线和第J条竖分割线上下对掉,是不会影响结果的。 ; 将横分割线和竖分割线分别按大至小快排一遍。使得切刀按从左至右从上至下顺序。 记F[I,j]表示切了前I条横分割线,前J条横分割线的最小代价。 每横线切I刀,总共分为I+1块横块,每竖线切J刀,总共分为J+1块横块。则有 F[I,j]=min{F[i-1,j]+row[i]* (j+1),F[I,j-1]+line[j]*(i+1)} row[i]与line[j]代表横竖切刀代价,最后答案即为F[n-1,m-1]。 时间复杂度是O(N^2)。 ;Problem #2: 牛宫(long) 题意简述 求一个矩阵中平均数大等于0的最大子矩阵的面积。 ;解题思路 首先,平均数大于等于0等价于和大于等于0,这样便于处理。 方法1:O(N^6)枚举获得部分分。 方法2:针对问题特点改进 二维问题常常可以转为一维来处理,对于一维问题就比较容易思考。 注意到题目要求的是“和”,因此如果将连续若干行的每列分别相加求和变为一行,并不会影响到求解。; 枚举连续行的组合,将二维矩阵压缩为了一维的数列。即将问题转化为在一行数中找出连续和大等于0???最长的一段。 如何快速求得一行数中连续和大等于0的最长的一段? 常用的连续和计算方法:是先预处理出前i个数的和sum[i],则sum[i,j]=sum[j]-sum[i-1]。 由于条件是sum[i,j]=0,不妨尝试把sum数组计算出来,再对它进行研究。 ; 假设已知最优区间是从第一个数开始,我们要找出它的右边界。则以i为右边界的区间的和即为sum[i]。易知当sum[i]=0时状态合法,而i最大则为最优。 当然,最优区间不一定是从第一个数开始的。假设最优区间的左边界为t,则此时以i为右边界的区间的和即为sum[i]-sum[t-1],枚举i与t,从其中找出大等于0的最长的区间(长度为i-t+1)。 尽管效率提高至o(n^4),但还是不够优?没有用好题目中只需大等于0的条件。; 再一次注意观察sum数组。考虑固定右界i,如果左界t与t+1的sum值均为合法解,则t+1的合法解时必然不如t优(因为左边界不断往右移动,而右边界不变,区间变短)。反之,对于固定的左界t,只需找到sum(i)=sum(t)的最大右界值即可,这就具有了某种意义上的单调性。能否利用呢? 将sum按照从大到小排序(注意需要保留原始位置的信息),并且设定一个头指针指向排序后的sum数组队头。枚举左边界,即每次移动左边界后,右界通过检查指针指向的sum值。 如果指向的sum值减去左界的sum值合法了,则不断向后移,直到相减0。; 在移动过程中找出原始位置最后面的,看是否能够更新最优值。(注意需要将区间长度乘以压缩的行数才是面积)至此,问题得到比较好的解决。 算法简述 1、枚举连续行,压缩为一维 ; 2、在一维区间中求出sum数组(sum[i]=sum[i-1]+num[i],sum[0]=0),并且记下每个sum值的原始位置; 3、将sum快排(注意需要保留原始位置的信息),形成队列,设head=1; 4、从0至n-1枚举left,while sum[head]-sum[l

文档评论(0)

1亿VIP精品文档

相关文档