题目链接

题解

首先可以想到分组后,去掉两边都填了数的组。

然后就会剩下\((-1,-1)\)和\((-1,x)\)或\((x,-1)\)这两种情况

因为是最小值序列的情况数,我们可以考虑从大到小填数,一个组填完了最小值就是当前填的数

设\(f[i][j][k]\)表示已经填到数\(i\)剩余\(j+k\)个填了一个数的组,其中有\(j\)个组是第一种情况填出来的,\(k\)个是第二种情况来的

分情况转移

如果这个数属于第一种情况,那么可以转移到:

\(f[i][j+1][k]:\)填到一个\((-1,-1)\)中

\(f[i][j-1][k]:\)和之前填了一个数的\((-1,-1)\)完成一组

\(f[i][j][k-1]:\)和\((x,-1)\)完成一组

如果属于第二种情况,那么可以转移到:

\(f[i][j][k+1]:\)不是最小值

\(f[i][j-1][k]:\)是最小值

最后因为\((-1,-1)\)是无序的,所以答案要乘上一个阶乘

Code

int cnt1 = 0, cnt2 = 0;
for (int i = 1; i < 2 * n; i += 2) {
if (a[i] == a[i + 1])
cnt2++;
else {
if (a[i] > a[i + 1]) swap(a[i], a[i + 1]);
if (a[i] == -1) cnt1++, flg[a[i + 1]] = 1;
else vis[a[i]] = vis[a[i + 1]] = 1;
}
}
int m = 0;
f[0][0][0] = 1;
for (int i = 2 * n; i >= 1; i--)
if (!vis[i]) {
m++;
if (!flg[i]) {
for (int j = 0; j <= cnt1 + cnt2; j++)
for (int k = 0; k <= cnt1; k++) {
pls(f[m][j + 1][k], f[m - 1][j][k]);
if (j) pls(f[m][j - 1][k], f[m - 1][j][k]);
if (k) pls(f[m][j][k - 1], 1ll * k * f[m - 1][j][k] % Mod);
}
}
else {
for (int j = 0; j <= cnt1 + cnt2; j++)
for (int k = 0; k <= cnt1; k++) {
pls(f[m][j][k + 1], f[m - 1][j][k]);
if (j) pls(f[m][j - 1][k], f[m - 1][j][k]);
}
}
}
int ans = f[m][0][0];
for (int i = 1; i <= cnt2; i++)
ans = 1ll * ans * i % Mod;

【AGC030F】Permutation and Minimum(DP)的更多相关文章

  1. 【agc030f】Permutation and Minimum(动态规划)

    [agc030f]Permutation and Minimum(动态规划) 题面 atcoder 给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{ ...

  2. 【BZOJ】1068: [SCOI2007]压缩(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...

  3. 【AGC030F】Permutation and Minimum DP

    题目大意 有一个长度为序列 \(a\),其中某些位置的值是 \(-1\). 你要把 \(a\) 补成一个排列. 定义 \(b_i=\min(a_{2i-1},a_{2i})\),求有多少种可能的 \( ...

  4. 【51nod1519】拆方块[Codeforces](dp)

    题目传送门:1519 拆方块 首先,我们可以发现,如果第i堆方块被消除,只有三种情况: 1.第i-1堆方块全部被消除: 2.第i+1堆方块全部被消除:(因为两侧的方块能够保护这一堆方块在两侧不暴露) ...

  5. 【bzoj1925】地精部落[SDOI2010](dp)

    题目传送门:1925: [Sdoi2010]地精部落 这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数.然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各 ...

  6. 【ZOJ2278】Fight for Food(dp)

    BUPT2017 wintertraining(16) #4 F ZOJ - 2278 题意 给定一个10*10以内的地图,和p(P<=30000)只老鼠,给定其出现位置和时间T(T<=1 ...

  7. 【POJ】3616 Milking Time(dp)

    Milking Time Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10898   Accepted: 4591 Des ...

  8. 【POJ】2385 Apple Catching(dp)

    Apple Catching Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13447   Accepted: 6549 D ...

  9. 【vijos】1764 Dual Matrices(dp)

    https://vijos.org/p/1764 自从心态好了很多后,做题的确很轻松. 这种题直接考虑我当前拿了一个,剩余空间最大能拿多少即可. 显然我们枚举每一个点拿出一个矩形(这个点作为右下角), ...

随机推荐

  1. Docker系列5--一些问题及解决

    1. 存储问题 1.1 挂载目录权限问题 在使用swarm创建服务的时候要挂载存储来获取运行文件,及写日志出去. 可运行文件相当于在集群中所有地方应该都能访问到,所以使用了NFS文件系统,在集群中所有 ...

  2. solr-jd

    springMVC.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  3. XML-RPC-3XML-RPC 与 XML-RPC 服务器类

    http://codeigniter.org.cn/user_guide/libraries/xmlrpc.html XML-RPC 与 XML-RPC 服务器类 CodeIgniter 的 XML- ...

  4. 基于【 centos7】五 || GitLab环境搭建

    一.基于Docker部署GitLab环境搭建 1.下载镜像 docker pull beginor/gitlab-ce:11.0.1-ce.0 2.创建GitLab 的配置 (etc) . 日志 (l ...

  5. 基2时抽8点FFT的matlab实现流程及FFT的内部机理

    前言 本来想用verilog描述FFT算法,虽然是8点的FFT算法,但写出来的资源用量及时延也不比调用FFT IP的好, 还是老实调IP吧,了解内部机理即可,无需重复发明轮子. 参考 https:// ...

  6. main函数前后

    void f1(void)__attribute__((constructor)); void f2(void)__attribute__((destructor)); void f1(void) { ...

  7. How to find Oracle EBS Weblogic Server Admin Port and URL

    How to find Oracle EBS Weblogic Server Admin Port and URL   Weblogic admin portMethod 1 Open the App ...

  8. [LeetCode] 17. 电话号码的字母组合 ☆☆☆(回溯) ###

    描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23"输出:[&q ...

  9. Flutter——Expanded组件("可伸缩"组件)

    Expanded组件可以结合Row和Column布局组件使用. Expanded组件的常用属性 属性 说明 flex 元素占整个父Row/Column的比例 child 子元素 import 'pac ...

  10. sed & awk 概述

    概述 一般情况下,从grep到sed和awk的学习过程是很自然的.sed和awk是一般用户.程序员和系统管理员们处理文本文件的有力工具. sed的名字来源于其功能,它是个字符流编辑器(stream e ...