一道不知道哪儿的练习题
2018-02-12 17:38
169 查看
题意:
有一张纸,被划分成了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)
有一张纸,被划分成了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)
相关文章推荐
- 一道练习题引申出来的知识点(二) 正则表达式
- 一道字符串的练习题
- C#中一道关于ADO.NET的基础练习题
- C#中一道关于线程同步的练习题——模拟多窗口售票
- Fibonacci(hdu1568)——一道我不知道怎么说的题
- 欧拉函数的一道练习题(附加容斥做法)
- 一道开阔视野的数学题(很有意思分享一下)在乘积1×2×3×4×............×698×699×700中,末尾只有( )个0 不知道标题什么改再发一遍
- 好心人来帮忙哈~ C++的一道题不知道怎么做了
- python一道关于随机数的练习题
- 一道SQL查询语句练习题
- 【一道不知道名字的题】AC自动机+dp
- 一道关于接口的练习题
- 一道月薪3W的java面试题 (小明和小强都是张老师的学生,张老师的生日是某月某日,2人都不知道张老师的生日)
- 一道经典plsql编程练习题
- 练习题(4) -- 一道简单而有有趣的题目
- 一道练习题引申出来的知识点(三) 集合/泛型集合
- 一天一道Shell练习题
- 一道练习题
- 一道sql练习题
- 一道关于简单界面设计的练习题