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. 终于能放进去啦!!

        这时我们就要

  1. for(r=prow;r<=prow+size-1;r++)  

  1.                     col[r]+=size; 

      当然不要忘记回溯  col[r]- =size; 

posted @ 2018-04-10 17:12  LandingGuys  阅读(87)  评论(0编辑  收藏  举报