Dilworth定理及其在算法题中的应用

news/2025/9/19 18:15:49/文章来源:https://www.cnblogs.com/Unalome-3301/p/19101456

1. Dilworth定理

Dilworth定理由数学家Robert P. Dilworth于1950年提出,它描述了偏序集中链和反链之间的关系。

  • 偏序集:一个集合 equipped with a partial order(即一个自反、反对称、传递的关系)。
  • :偏序集的一个子集,其中任意两个元素都是可比较的(即全序子集)。
  • 反链:偏序集的一个子集,其中任意两个元素都是不可比较的。

Dilworth定理:在任意有限偏序集中,其最小链划分的大小(即将偏序集分解成链的最小数量)等于其最大反链的大小(即反链中元素的最大数量)。

例子:考虑一个序列 [3, 1, 2],其中偏序关系基于元素值和位置(例如,元素值越小越“小”,但位置也影响)。Dilworth定理可以帮助我们找到最小链分解。

2. 序列分解定理

序列分解定理是Dilworth定理在序列上的一个特例。它关注的是序列能否被分解为k个非递减子序列。

  • 非递减子序列:一个子序列其中每个元素都不小于前一个元素(即单调非递减)。
  • 分解:将原序列的每个元素分配到k个子序列中,使得每个子序列都是非递减的。

序列分解定理:一个序列可以被分解为k个非递减子序列 当且仅当 序列中最长递减子序列的长度不超过k。

这意味着:

  • 如果序列中存在一个长度为k+1的递减子序列,那么它无法被分解成k个非递减子序列。
  • 反之,如果最长递减子序列的长度为k,那么序列可以被分解成k个非递减子序列。

Dilworth定理为这个结论提供了严格的数学基础:在序列构成的偏序集(基于值和位置)中,反链对应递减子序列,链对应非递减子序列。

3. 定理在算法题中的应用 (CF-2143-D1)

题目链接:[[https://codeforces.com/contest/2143/problem/D1]]
这个题需要统计所有“好”子序列(即可以被分解为两个非递减子序列的子序列)。根据序列分解定理,这等价于统计所有最长递减子序列长度不超过2的子序列。这可以用dp快速解决:记dp[i][j](其中 ij 表示两个非递减链的最后一个元素值,且 i<=j)为子序列的数量。对于每个新元素 v,我们检查是否能将其添加到第一个链(如果 v>=i)或第二个链(如果 v>=j),并更新状态,最后统计即可。

直观上,如果序列中有三个元素递减(如 a > b > c 且顺序出现),那么这三个元素无法被分配到两个非递减链中(因为每个链必须非递减,但递减关系要求它们分属不同链,但只有两个链,矛盾)。反之,如果没有这样的三个元素,那么总可以通过贪心将序列分解为两个非递减链。

AC代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9+7;signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);auto solve = [&](){int n;cin >> n;vector<int> a(n);for (int i=0; i<n; i++) cin >> a[i];vector<vector<int>> dp(n+1, vector<int>(n+1, 0));dp[0][0] = 1;  // 空序列for (auto v: a){vector<vector<int>> cpydp = dp;for(int i=0; i<=n; i++){for(int j=0; j<=n; j++){if(dp[i][j] == 0) continue;if(v >= i)cpydp[v][j] = (cpydp[v][j]+dp[i][j])%mod;else if(v >= j)cpydp[i][v] = (cpydp[i][v]+dp[i][j])%mod;}}dp = cpydp;}int ans = 0;for(int i=0; i<=n; i++)for(int j=0; j<=n; j++)ans = (ans+dp[i][j])%mod;cout << ans << "\n";};int T;for(cin>>T; T--; ) solve();return 0;
}

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

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

相关文章

error: xxxxx does not have a commit checked out

$ git commit -m "test" *error: AW30N does not have a commit checked outfatal: updating files failed解决方法: 删除多余的文件夹AW30N

049-WEB攻防-文件上传存储安全OSS对象分站解析安全解码还原目录执行

049-WEB攻防-文件上传&存储安全&OSS对象&分站&解析安全&解码还原&目录执行-cnblog#文件-解析方案-执行权限&解码还原 1、执行权限文件上传后存储目录不给执行权限 原理:开启禁止目录执行…

云原生周刊:MetalBear 融资、Chaos Mesh 漏洞、Dapr 1.16 与 AI 平台新趋势

云原生热点 MetalBear 获得 1250 万美元种子轮融资,推动 Kubernetes 开发解决方案 以色列初创公司 MetalBear 宣布完成 1250 万美元种子轮融资,由 TLV Partners 领投,TQ Ventures、MTF、Netz Capital 及多位知名天使…

AI一周资讯 250913-250919

原文: https://mp.weixin.qq.com/s/bnJ-kyOojPi6rqgx0NOXxg 阿里版Cursor正式收费!Qoder全球推出付费订阅,小白用了都说“最懂我” 2025年9月15日,阿里AI编程平台Qoder(被称为“阿里版Cursor”)面向全球用户正式推…

045-WEB攻防-PHP应用SQL二次注入堆叠执行DNS带外功能点黑白盒条件-cnblog

045-WEB攻防-PHP应用&SQL二次注入&堆叠执行&DNS带外&功能点&黑白盒条件-cnblog PHP-MYSQL-二次注入-DEMO&74CMS1、DEMO-用户注册登录修改密码1.注册新用户时,将注入的内容包含在注册的用户名…

linux 命令语句

rt 快csp初赛了,发现s组第一题一般是linux 命令语句,碎屑。 c cat:连接和显示文件内容 cd:切换工作目录 chmod:修改文件或目录的权限 chown:修改文件或目录的所有者 cp:复制文件或目录 d df/du:显示磁盘使用情…

用 Kotlin 实现英文数字验证码识别

在本教程中,我们将使用 Kotlin 和 Tesseract OCR 库实现对英文数字验证码的识别。Tesseract 是一个开源的 OCR 引擎,能够从图像中提取文本内容。结合 Kotlin 的简洁语法,我们可以高效地完成这个任务。环境准备 (1)…

UM2003A 一款 200 ~ 960MHz ASK/OOK +18dBm 发射功率的单发射

UM2003A 一款 200 ~ 960MHz ASK/OOK +18dBm 发射功率的单发射Si24R03 是一款高度集成的低功耗 SOC 芯片,其集成了基于 RISC-V 核的低功耗 MCU 和工作在 2.4GHz ISM 频段的无线收发器模块。 MCU 模块具有低功耗、L…

达芬奇(DaVinci Reslove)字体文件 bugb标签

今天有小伙伴 突然 反馈 字幕轨导 execl的插件 字幕没有导出来。我拿到 srt文件是 文件1这样格式,我导入字幕轨后 ,再导出来 格式变了 多了 一个 <…

语音芯片怎样挑选?语音芯片关键选型要点?

语音芯片怎样挑选?语音芯片关键选型要点? 选择语音芯片需根据具体应用场景和性能需求进行综合评估,以下是关键选型要点: 一、核心性能参数 1、采样率与信噪比 高采样率(如16位ADC)可减少声音失真,信噪比≥75dB能…

KingbaseES Schema权限及空间限额

一、权限授予操作 1. 基础权限赋予 1.1 创建测试环境-- 1.创建测试用户 test=# CREATE USER schema_user WITH PASSWORD Schema@123; CREATE ROLE-- 2.创建测试Schema test=# CREATE SCHEMA test_schema AUTHORIZATION…

UM2003A 一款 200 ~ 960MHz ASK/OOK +18dBm 发射功率的单发射芯片

UM2003A 一款 200 ~ 960MHz ASK/OOK +18dBm 发射功率的单发射芯片UM2003A 是一款工作于 200 ~ 960MHz 频段的单片集成、高性能、可独立运行的 OOK 发射器。内部集成的 OTP 方便用户对各种射频参数以及特色功能进行编程…

HTTP库开发实战:核心库与httpplus扩展库示例解析

实战导向的HTTP库开发教程!本文以核心库基础功能为起点,结合httpplus扩展库示例,演示如何高效实现HTTP协议相关功能。 一、两个库有何不同? 首先需要了解,LuatOS采用核心库和扩展库的模块化设计,核心库负责底层与…

QMT交易系统向服务器同步订单丢失问题排查

QMT交易系统向服务器同步订单丢失问题排查1.挂单系统报错,异步挂单后订单挂单回调更新OrderID报错:查找对象为空,起初以为是多线程共享对象属性同步不及时造成的,后来发现在异步挂单执行完毕才对RequestOrderStock…

笔记1

1、bug包含哪些内容 ? 所属产品、所属模块、所属项目、当前指派、bug类型、操作系统、浏览器、bug标题、严重程度、优先级、重新步骤、相关需求2、bug的等级? 1级bug (致命bug) 2级bug (严重bug) 3级bug (一…

用 Python 和 Tesseract 实现英文数字验证码识别

本教程将教您如何使用 Python 和 Tesseract OCR 引擎来识别英文数字验证码。Tesseract 是一个非常强大的 OCR 引擎,支持多种语言的字符识别。结合 Python 的易用性,我们可以很容易地完成验证码识别。环境准备 (1)安…

深入解析:上门按摩平台 “0 抽成 + 无底薪” 双模式拆解:如何让技师主动创收?

深入解析:上门按摩平台 “0 抽成 + 无底薪” 双模式拆解:如何让技师主动创收?2025-09-19 17:51 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overfl…

实用指南:OSPF特殊区域、路由汇总及其他特性

实用指南:OSPF特殊区域、路由汇总及其他特性pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &qu…

禅道以及bug

禅道 一、禅道的介绍 1、禅道是一个项目管理工具、bug管理工具、用例管理工具; 2、作用:为了解决企业中的管理中混乱、无序的现象 3、来源:易软天创公司 4、架构:bs 架构 5、项目管理工具: 禅道、tapd(腾讯)、j…

SUB-1G 无线收发芯片 DP10RF001 低功耗 (G) FSK/OOK 智能门锁,资产追踪、无线监控

SUB-1G 无线收发芯片 DP10RF001 低功耗 (G) FSK/OOK 智能门锁,资产追踪、无线监控产品概述. DP10RF001 是一款工作于 200MHz~960MHz 范围内的低功耗、高性能、单片集成的 (G) FSK/OOK 无线收发机芯片。内部集成完整的…