当前位置: 首页 > news >正文

题解:P15301 [ROI 2012 Day 2] army 汗国军队

题意

给定 \(n\)\(1,\cdots,n\) 的一个大小为 \(k\) 的子序列 \(a\)。求有多少长度为 \(n\) 的排列 \(p\),使得 \(a\)\(p\) 的一个 LIS。\(k\leq n\leq 15\)

题解

题意看上去一脸 DP 套 DP 的样子,经典地,我们这样刻画 LIS:维护一个集合 \(S\),每次考虑一个数 \(x\),将 \(S\) 中第一个大于 \(x\) 的数替换成 \(x\),若不存在,则直接加入 \(x\),最终 \(S\) 的大小就是 LIS 的长度。把题述条件拆成两个部分:一部分是 \(a\)\(p\) 中是按值从小到大依次出现的,另一部分是 LIS 长度为 \(k\)。设计 DP:令 \(f_{S,T}\) 表示考虑了 \(S\) 中的数,计算 LIS 时维护的集合为 \(T\) 时的方案数。转移时枚举加入一个数 \(x\notin S\)\(T\) 直接按照上述方式更新。注意若 \(x\in a\),则需要保证 \(a\)\(<x\) 的数已经加入 \(S\) 中。最终答案即为 \(\sum\limits_{|T|=k}f_{U,T}\)。注意到 \(T\subseteq S\),因此状态数为 \(\mathcal{O}(3^n)\),时间复杂度为 \(\mathcal{O}(n3^n)\)

我偷懒写 unordered_map 也过了。

代码
#include <bits/stdc++.h>using namespace std;using ll = long long;
using i128 = __int128;
using ui = unsigned int;
using ull = unsigned long long;
using u128 = unsigned __int128;
using ld = long double;
using pii = pair<int, int>;
const int N = 15, S = 1 << 15;template<typename T> inline T lowbit(T x) { return x & -x; }
template<typename T> inline void chk_min(T &x, T y) { if (y < x) x = y; }
template<typename T> inline void chk_max(T &x, T y) { if (x < y) x = y; }int n, k, mask[N], pc[S];
ll ans;
unordered_map<int, ll> f[S];
bool mark[N];int main() {ios::sync_with_stdio(0), cin.tie(0);cin >> n >> k;for (int i = 1, s = 0, x; i <= k; ++i) {cin >> x, --x;mark[x] = 1;mask[x] = s, s ^= 1 << x;}for (int s = 1; s < 1 << n; ++s) pc[s] = pc[s ^ lowbit(s)] + 1;f[0][0] = 1;for (int s = 0; s < (1 << n) - 1; ++s) {for (auto [t, val] : f[s]) {for (int x = 0; x < n; ++x) if (~s >> x & 1) {if (mark[x] && (s & mask[x]) != mask[x]) continue;int ns = s ^ (1 << x), nt = (t ^ lowbit(t & -(1 << x))) ^ (1 << x);if (pc[nt] <= k) f[ns][nt] += f[s][t];}}}for (int t = 0; t < 1 << n; ++t) if (pc[t] == k) ans += f[(1 << n) - 1][t];cout << ans;return 0;
}
http://www.jsqmd.com/news/382601/

相关文章:

  • CMake:现代C/C++工程的构建中枢
  • web ui 测试隐式等待深度解析
  • web ui 测试智能等待深度解析
  • Hive SQL优化:分区表+分桶表提升查询效率
  • 医疗仪器整机研发设计怎么做?2026创新合规智能化趋势指南|新纪元必读 - 匠言榜单
  • Nightwatch.js深度解析
  • 【Docker进阶篇】Docker Compose 实战:一键启动Web+数据库+缓存,微服务环境部署不再绕弯
  • C++中链表的虚拟头结点:应用场景与运用时机
  • 2026年 电感厂家推荐排行榜:共模电感/贴片电感/PFC电感/扁平线共模电感/工字电感/贴片功率电感/贴片绕线电感/色环电感/磁环电感/大电流电感/数字功放电感 - 品牌企业推荐师(官方)
  • 【Docker进阶篇】Docker Compose实战:Spring Boot与Redis服务名通信全解析
  • langGraph从入门到精通(四)——基于LangGraph的State状态模式设计 - 指南
  • 关于凸性的 things(wqs + slope trick + 闵可夫斯基和)
  • 【Docker进阶篇】拒绝重复构建镜像!.env文件+Profile实现多环境无缝切换
  • 华为OD机考双机位C卷 - 测试用例执行计划 (Java Python JS GO C++ C)
  • 手摸手在扣子平台搭建周报智能体[特殊字符]
  • 华为OD机考双机位C卷 - 相对开音节 (Java Python JS GO C++ C)
  • 为什么通用寄存器RAX,EAX,AX后面都有一个‘X’? - i686
  • 【MATLAB】多子阵合成孔径声纳(SAS)成像仿真——基于时域反向投影(BP)算法 - 详解
  • 【KnowledgeLITE | 知识速递 第一期】为什么通用寄存器RAX,EAX,AX后面都有一个‘X’? - i686
  • Hadoop 在大数据领域的开源生态优势
  • 多智能体协作在复杂推理任务中的应用
  • 1、、、
  • 安全防护:AI多轮对话系统中的敏感信息识别与过滤机制
  • proteus_snake_pswd小记
  • 大数据领域Kafka与其他消息队列的对比分析
  • Debian 13 VMware Fusion 字号太小?一招解决!
  • 语言模型在复杂决策树生成中的能力研究
  • 11:【Windows Git】换行符警告 CRLF/LF core.autocrlf设置
  • 12:【GitHub PAT】Personal Access Token过期/2FA后HTTPS推送失败(2026仍高频)
  • 深入解析:推荐使用的C++ IDE