题目链接

题解

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

然后就会剩下\((-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. MyBatis_01 框架

    Mybatis概述 Mybatis是什么 Mybatis是一个持久层框架.   Mybatis的作用 Mybatis是一个持久层框架,当然作用就是操作数据库的(增删改查).   为什么需要学习Myba ...

  2. jacascript Math (算数)对象

    前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! 实际应用中用的比较多的有:round(); random(); floor(); ceil(); 其次还有 ...

  3. (七)easyUI之Accordion折叠面板:普通的静态面板

    一.普通的静态面板 前台 <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  4. 【SQL Server DBA】日常巡检语句3:特定监控(阻塞、top语句、索引、作业)

    原文:[SQL Server DBA]日常巡检语句3:特定监控(阻塞.top语句.索引.作业) 1.查询阻塞信息.锁定了哪些资源 --1.查看阻塞信息 select spid,loginame,wai ...

  5. Sql Server根据字符串拆分多列

    select parsename(REPLACE(Field,',','.'),3) as segment_1, parsename(REPLACE(Field,',','.'),2) as segm ...

  6. JDBC 学习复习7 学习 Apache 开源DBCP 数据源

    DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包:comm ...

  7. WIN10升级失败,故障代码 0X8007042B-0X4000D 解决

    个人博客链接:WIN10升级失败,故障代码 0X8007042B-0X4000D 解决

  8. Django对postgresql数据库进行分组聚合查询

    action(methods=['GET'], detail=False, url_path='count') def count(self, request): """ ...

  9. 升级xcode11&ios13的坑

    Swift Packages 目前Pod跟SPM的兼容还没做好,配置好SPM后,Pod不能进行正常更新,先配置好Pod再集成SPM则没有问题 Pod以后的更新可能会解决这个问题,也会有越来越多的库支持 ...

  10. python读取图像后变换通道顺序

    直接通过python矩阵操作变换,简单高效 org_img = cv2.imread('cat.jpg') img = org_img[:, :, ::-1] 其中,[::-1] 表示顺序相反操作 , ...