zoukankan      html  css  js  c++  java
  • 一道不知道哪儿的练习题

    题意:
    有一张纸,被划分成了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)
     
  • 相关阅读:
    React组件传值(子传父)
    React里面的componentDidMount()钩子函数用法
    修改主键的值
    mysql 命令
    Android ContentResolver
    linux下vim命令详解
    26种基于PHP的开源博客系统
    [环境配置] 如何为Apache绑定多IP多域名
    display属性值
    link标签 rel="stylesheet"
  • 原文地址:https://www.cnblogs.com/TheRoadToTheGold/p/8445163.html
Copyright © 2011-2022 走看看