POJ1020-Anniversary Cake 有技巧的dfs
转自https://blog.csdn.net/lyy289065406/article/details/6683250
对于这种标记,不考虑线段树,而是有技巧的
1.首先将小蛋糕的size记录在数组sizeNum[size]++
这样做就不用排序什么了,因为数据小
在循环时可以用(for(size=10;size>0;size++))来将蛋糕一个个从大到小地放进去
2.其次最重要的 用col[i] 表示第i列已经填满了多少个格子
3.开始dfs
1.找到最小的col ,这样就是得到最大的剩余空间(因为col[i] 表示第i列已经填满了多少个格子)
2.得到最大的剩余空间就可以将size最大的放进去,并且保证从下到上都依次填满
3.开始枚举各种size,同时还要检查,这个size能不能放进去
4. 确定了这个最小的col后,还要从这个col开始看符合col剩余空间>size 的 col有多少列,相当于求行宽吧,这样就知道能不能把它放进去
5. 终于能放进去啦!!
这时我们就要
- for(r=prow;r<=prow+size-1;r++)
- col[r]+=size;
当然不要忘记回溯 col[r]- =size;