博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「ZJOI2009」多米诺骨牌
阅读量:5339 次
发布时间:2019-06-15

本文共 857 字,大约阅读时间需要 2 分钟。

要求满足任何相邻两行之间都有至少一个 骨牌横跨,任何相邻两列之间也都至少有一个骨牌横跨。

枚举有哪些列之间是没有骨牌横跨的,算出该情况下合法的方案数,容斥。

确定了哪些列是没有骨牌横跨的,列就被划分成了几个区间。

计算前\(i\)个区间的 任意两行之间有骨牌的 方案。

对于当前的\(i\),合法的方案为 任意摆放的方案,再依次减去:对于行 \([1,i-1]\) ,该行以及之前的行 任意两行之间有骨牌,该行之后的行 随意摆放的方案数。(余下的都是合法的方案)

实际上,这里需要知道某一个二维区间任意摆放的方案数(因为有不能摆放的位置),需要预处理。

这里,处理出 \([lk,rk]\)行 任意摆的方案数复杂度\(o(n^3)\),而 计算总的方案复杂度\(o(n^2)\)

该部分的复杂度为\(o(2^n*n^3)\),当然,复杂度不满。

现在求左上端点\([l,r]\),右下端点\([l1,r1]\)的区间任意摆放的方案。

考虑枚举\(r,r1,l\),求出\(l1 \in [l,n]\)的答案。

之后就是一个轮廓线dp了,转移的时候枚举当前点的覆盖情形即可,一次的复杂度为\(o(2^n*n^2 )\)

复杂度\(o(2^n*n^5)\)...但实际上\(n=15,m=15\)的情况下只有大约有2e8的计算。

在最终测试的时候表现十分的优秀。

#include
#define rep(q,a,b) for(int q=a,q##_end_=b;q<=q##_end_;++q)#define dep(q,a,b) for(int q=a,q##_end_=b;q>=q##_end_;--q)#define mem(a,b) memset(a,b,sizeof a )#define debug(a) cerr<<#a<<' '<
<<"___"<

转载于:https://www.cnblogs.com/klauralee/p/10855997.html

你可能感兴趣的文章
触发器课程SQL Server 知识梳理九 触发器的使用
查看>>
信息浏览器从Android的浏览器中传递cookie数据到App中信息浏览器
查看>>
限制对比度自适应直方图均衡化算法原理、实现及效果
查看>>
MD5 加密
查看>>
ef oracle
查看>>
mysqlmysql 5.7.x insert子查询 报错解决方法
查看>>
perl学习(6)控制语句
查看>>
每日踩坑 2018-01-09 WebAPI会如何面对URL中的空串string参数?
查看>>
Qt之线程基础
查看>>
客户端连接linux虚拟机集群报错
查看>>
linux下部署一个JavaEE项目的简单步骤
查看>>
Egret学习笔记 (Egret打飞机-6.实现敌机飞起来)
查看>>
eclipse中调整字体大小和改变背景颜色
查看>>
hash储存机制
查看>>
[Android学习系列16]Android把php输出的json加载到listview
查看>>
20145205 《信息安全系统设计基础》第14周学习总结
查看>>
XML中CDATA和#PCDATA的区别
查看>>
6)添加一个窗口的图标
查看>>
SQL SERVER的锁机制(二)——概述(锁的兼容性与可以锁定的资源)
查看>>
ssh和alias快速登录远程机器
查看>>