[Gym-100343E]Convex Permutominoes 题解

news/2025/10/10 18:30:31/文章来源:https://www.cnblogs.com/MoyouSayuki/p/19133653

观察一下:

  1. \(n\times n\) 的网格肯定每行每列都被填上了。
  2. 如果只保留横线,可以还原出竖线
  3. 只保留横线的话,因为是一个封闭图形,所以会有上半部分和下半部分,分别覆盖了上边界和下边界。
  4. 为了保证是凸的,上半部分一定是峰形,下半部分是谷形。
  5. 上半部分要在下半部分上面。
  6. 由于每一列都有且仅有一个竖线,所以如果考虑上半部分和下半部分中 \(1\sim i\) 列部分的末端,一定是其中一个继续延长,另一个断开成新的一条横线。

设计 DP \(f_{i, j, k,0/1,0/1}\) 表示当前考虑 \(1\sim i\) 列,上半部分横线在所有可以放横线的行中相对排名是 \(j\),下半部分的是 \(k\),且上半部分是否开始下降,下半部分是否开始上升,的方案数,因为剩余能放横线的行已经确定是 \(n - i + 2\) 个,所以不用把这一维放进状态里。

转移是容易的,枚举成新的横线的是上半部分还是下半部分,然后再枚举横线在哪里即可。

时间复杂度 \(O(n^4)\)

[Gym-100343E]Convex Permutominoes观察一下:1. $n\times n$ 的网格肯定每行每列都被填上了。
2. 如果只保留横线,可以还原出竖线
3. 只保留横线的话,因为是一个封闭图形,所以会有上半部分和下半部分,分别覆盖了上边界和下边界。
4. 为了保证是凸的,上半部分一定是峰形,下半部分是谷形。
5. 上半部分要在下半部分上面。
6. 由于每一列都有且仅有一个竖线,所以如果考虑上半部分和下半部分中 $1\sim i$ 列部分的末端,一定是其中一个继续延长,另一个断开成新的一条横线。设计 DP $f_{i, j, k,0/1,0/1}$ 表示当前考虑 $1\sim i$ 列,上半部分横线在所有可以放横线的行中相对排名是 $j$,下半部分的是 $k$,且上半部分是否开始下降,下半部分是否开始上升,的方案数,因为剩余能放横线的行已经确定是 $n - i + 2$ 个,所以不用把这一维放进状态里。转移是容易的,枚举成新的横线的是上半部分还是下半部分,然后再枚举横线在哪里即可。时间复杂度 $O(n^4)$。```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <set>
#define int long long
#define x first
#define y second
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
const int N = 50 + 10, M = 1e5, mod = 998244353;int n, f[N][N][N][2][2];
int qmi(int a, int b) {int res = 1;while(b) {if(b & 1) res = res * a % mod;a = a * a % mod, b >>= 1;}return res;
}
signed main() {ios::sync_with_stdio(0), cin.tie(0); freopen("permutominoes.in", "r", stdin);freopen("permutominoes.out", "w", stdout);cin >> n;for(int i = 1; i <= n; i ++)for(int j = i + 1; j <= n; j ++)f[2][i][j][0][0] = 1;for(int i = 2; i < n; i ++) {for(int j = 1; j <= n; j ++) {for(int k = j + 1; k <= n; k ++) {for(int o1 = 0; o1 < 2; o1 ++) {for(int o2 = 0; o2 < 2; o2 ++) {int t = f[i][j][k][o1][o2];if(!t) continue;int c = n - i + 2;if(!o1) {for(int p = 1; p < j; p ++) {f[i + 1][p][k - 1][o1][o2] += t;}}for(int p = j + 1; p < k; p ++) {f[i + 1][p - 1][k - 1][1][o2] += t;}if(!o2) {for(int p = k + 1; p <= c; p ++) {f[i + 1][j][p - 1][o1][o2] += t;}}for(int p = j + 1; p < k; p ++) {f[i + 1][j][p][o1][1] += t;}}}}}}int ans = 0;for(int j = 1; j <= n; j ++) {for(int k = j + 1; k <= n; k ++) {for(int o1 = 0; o1 < 2; o1 ++) for(int o2 = 0; o2 < 2; o2 ++) if(f[n][j][k][o1][o2]) {ans += f[n][j][k][o1][o2];}}}cout << ans << '\n';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/934323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis 中的动态 SQL 的相关使用方法(Javaee/MyBatis) - 教程

MyBatis 中的动态 SQL 的相关使用方法(Javaee/MyBatis) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

网络优化问题

一、基本概念 【发点和收点】设点 v 是有向图 D (带箭头)的一个顶点: 1、发点:如果不存在以v为终点的弧,则称v是D的一个发点(源),通常称为vs; 2、收点:如果不存在以v为始点的弧,则称v是D的一个收点(汇),通…

维护区间[1,i-1]本质不同逆序对的个数板子(不同种类的逆序对个数)

维护区间[1,i-1]本质不同逆序对的个数板子(不同种类的逆序对个数)点击查看代码 #include <bits/stdc++.h> #define LL long long using namespace std; const int N = 1e5 + 9; int T, n, cnt, flag, maxn; LL…

不只是配送:同城配送系统如何成为新零售时代的核心基础设施 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java环境安装备忘录

安装Java 很久没有用Java了,不过最近因为GraalVM的出现,想尝试一下。安装JDK 对于JDK的选择,大概有四类:一、Oracle JDK → https://www.oracle.com/java/ 官方正统JDK,不过对LTS版本8、11、17、21都采取对商用免…

深入解析:【Spring MVC终极指南】一文掌握请求处理与响应!从Servlet原生方式到SpringMVC高效优雅写法

深入解析:【Spring MVC终极指南】一文掌握请求处理与响应!从Servlet原生方式到SpringMVC高效优雅写法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

foobar2000 v2.25.2 汉化版

foobar2000 v2.25.2 汉化版 -----------------------【软件截图】---------------------- -----------------------【软件介绍】---------------------- foobar2000 是一个 Windows 平台下的高级音频播放器.包含完全支…

比特币地址投毒攻击深度剖析

本文深入分析比特币区块链上的地址投毒攻击技术,探讨攻击原理、实施方式、成功案例及防护措施,揭示攻击者如何通过生成相似地址诱骗用户误转资金。比特币地址投毒攻击 地址投毒攻击是一种社会工程学攻击形式,恶意行…

为什么大家都爱用微擎?这几点真的太香了

微擎是一个基于 PHP 的开源应用生态系统,大家爱用微擎主要是因为它具有以下优势: 低开发成本 开源免费:微擎可以免费下载和使用,对于个人开发者和中小企业来说,大大降低了软件开发的前期成本投入。 节省时间:微擎…

【JS逆向百例】某坤行 1101,雪球 1038,新 acw_sc__v2 逆向分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许可禁…

详细介绍:标准型ELN成主流:定制型为何“遇冷”?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JAVA 的模板方法模式解析

模板方法是什么?模板方法模式(Template Method Pattern)是一种行为型设计模式。相当于父类定流程,子类补细节。也就是说,父类定义好“做事的流程”(算法骨架),具体每一步怎么做由子类决定。生活举例例如你去吃…

【Linux】Ext系列文件系统(下) - 实践

【Linux】Ext系列文件系统(下) - 实践2025-10-10 18:03 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block …

《构建之法-现代软件工程》 -阅读和提问作业1

1.关于“敏捷迭代”与“应急可靠性”的辩证融合问题 《构建之法》中讲敏捷开发时,反复强调“拥抱变化、快速迭代”的核心思想,这在很多互联网产品开发中确实能快速响应用户需求。但我们应急领域的软件,性质和普通产…

计算机视觉与AI在人体成分分析中的技术突破

本文深入解析了基于计算机视觉和深度学习技术的人体成分分析系统,通过智能手机照片实现体脂率估算和个性化3D建模,涵盖了卷积神经网络、半监督学习等核心技术架构。计算机视觉在人体成分分析中的应用 通过某中心的健…

2024-网鼎杯web-PyBlockly

PyBlockly分析源代码,逐步确定,asd这里就是关键点所在, 但是这里有check_for_blacklisted_symbols对[!"#$%&()*+,-./:;<=>?@[\]^_`{|}~]这些符号进行过滤 但是asd有经过unidecode.unidecode该函数,所以…

关于微信小程序申请地理位置接口申请

注:非实际功能申请 应该是自动审核 例子:因当前业务涉及工作人员外出打卡服务,需获取工作人员所在地理位置以及实时运动轨迹记录工作人员打卡效率及路线,申请接口以便完成工作人员打卡以及投放广告的业务场景的闭环…

c++学习总结

c++学习总结1 引用:相当于变量的第二标签。主要用于传参、函数返回值(只能返回全局变量、局部静态变量的引用)。

2025 年大闸蟹蟹卡 / 大闸蟹礼盒 / 大闸蟹礼券 / 好蟹汇大闸蟹选择指南:生态养殖与全国服务双保障解析

行业背景随着消费升级与健康饮食理念普及,阳澄湖大闸蟹凭借独特口感与品质,成为节庆礼品与家庭餐桌的热门选择。但市场上品牌繁杂,部分产品存在以次充好、养殖环境不达标、售后保障缺失等问题,让消费者在选购蟹卡、…

分享一个超级耐玩的游戏 转载 植物大战僵尸融合版最新版(v3.0.1)支持安卓版+PC电脑版

分享一个超级耐玩的游戏 转载 植物大战僵尸融合版最新版(v3.0.1)支持安卓版+PC电脑版植物大战僵尸融合版最新版(v3.0.1)安卓版+PC电脑版 以下为转载内容 与植物大战僵尸杂交版一样,融合版也是一个第三方修改版,是…