下一专题预告:《编程珠玑》
#include <iostream>
#include <stdio.h>
using namespace std;
/*
问题:给定一个方阵,其中每个单元(像素)非黑即白。设计一个算法,找出四条边都是黑色像素的最大子方阵。
分析:暴力破解:考虑到方阵的组成只需要确定左上角坐标(x1,y1)和右下角坐标(x2,y2),因此可以通过一个四重循环来遍历生成:
x1,y1,x2,y2,对于得到的坐标,还需要判定4条边是否为全部黑色,总的边的长度=2*(x2-x1) + 2*(y2-y1),
因此总的时间复杂度是O(N^4)。
贪心:贪心选择(剩余问题是原问题的子问题)+最优子结构(子问题的最优解包含在全局最优解),应该不能用贪心,
递归:将方阵对半划分?不对,需要找到子问题最小的处理方式,最小就是一个像素,
回溯:
分治:
动态规划:
此题可以通过:修改判定一个方阵是否四条边全为黑色的时间复杂度从O(N)降到O(1),采用前缀和的方式进行预处理。
处理过程是:从右到左,从下到上,如果当前元素A[r][c]为白色,令其右侧0和下方零的个数为0,;
即A[r][c].zerosRight=0,A[r][c].zerosBelow = 0;
否则:A[r][c].zerosRight = A[r][c+1].zerosRight + 1;
A[r][c].zerosBelow = A[r+1][c].zerosBelow + 1;
然后判断某个以(row,col)为左上角顶点,长度为size的方阵是否是符合指定四条边全为黑色:
A[row][col].zerosRight >= size && A[row][col].zerosBelow >= size &&
A[row][col + size - 1].zerosBelow >= size && A[row + size -1][col].zerosRight >= size
即可
注意:对于长度为N的方阵,寻找长度为size的方阵时,共有N - size + 1