1.Largest Plus Sign问题:此问题的思路为求输入矩阵非零点的上、下、左、右连续一的个数,包括这个点本身。引用动态规划的思想,当一个点为0时,他的上下左右连续1个数为0;非零时,上连续1个数为上面点的个数加1,下连续1个数为下面点的个数加1
,左连续1个数为左面点的个数加1,右连续1个数为右面点的个数加1。每个点拥有这四个量,他们的最小值为以这个点为中心的加号的大小。然后遍历所有点,查找这些点中加号大小的最大值。但是由于本题对于时间复杂度和空间复杂度的要求,在后面的代码中进行了多次的优化,才到达AC。
简记优化过程:原始矩阵和上下左右四个值通过N*N的四个矩阵存储(MLE)
->上下左右值通过一个N*N矩阵存储,每次只更新到最小值(MLE)
->使用vector存储原始矩阵,只存储零元素,使用到了vector的查找(TLE)
->自定义结构体,使用unordered_set存储零元素,但是用函数封装了rank的计算(TLE)
->去除函数封装(AC)
2.Ones and Zeros 可以看作含有两个weight和value的背包问题,对两个变量同时进行优化。将每个str的value看作1,weight看作其中1和0分别的个数,最后需要的m和n的个数看作背包总容量。1和0的任一weight分别不可以超过m和n;
3.C++高维数组的申请;
4.使用引用传递参数;
5.01背包问题的详细解释见此;