一道不知道哪儿的练习题

Posted 日拱一卒 功不唐捐

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道不知道哪儿的练习题相关的知识,希望对你有一定的参考价值。

题意:
有一张纸,被划分成了n*m的格子,每个格子是黑色或者是白色的,每次可以选择一条竖的或者横的不跨越格子的线,然后将纸对折。对折时要保证两面对应的格子颜色相同,且不能将大的一面覆盖到小的上面。求若干次操作后不同的结局。结局不同当且仅当剩下的纸在原矩阵中位置不同。
n,m<=250
 
 
dp[u][d][l][r] 表示能否折成上边u下边d左边l右边r的矩形
枚举折痕,判断是否能折
时间复杂度为O(n^2 * m^2 *(n+m)* 判断复杂度)
 
优化:
横着折和竖着折没有影响
所以答案=横着折的方案数*竖着折的方案数
那么将矩形的每一列哈希成1个格子,就变成了1行,可以求竖着折的方案数
将矩形的每一行哈希成1个格子,就变成了1列,可以求横着折的方案数
dp[l][r]表示能否折成[l,r]的格子
枚举折痕k,判断是否能折
时间复杂度为O(n^3 * 判断复杂度)
判断可以枚举判断,就是O(n^4)
 
再优化:
判断是否可行实际上就是找到 以折痕为中点的最长回文串长度
这个manacher预处理,就可以O(1)判断
最后时间复杂度为O(n^3)
 

 

以上是关于一道不知道哪儿的练习题的主要内容,如果未能解决你的问题,请参考以下文章

一道不知道错哪儿了的算法题

一道不知道错哪儿了的算法题

一道Spark练习题

快速排序+一道练习题

一道Python练习题引发的,一个知识点的探讨:删除列表中特定元素的几种方法

一道Shell编程趣味练习题,看你会不会?