【AGC030F】Permutation and Minimum(DP)
题解
首先可以想到分组后,去掉两边都填了数的组。
然后就会剩下\((-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)的更多相关文章
- 【agc030f】Permutation and Minimum(动态规划)
[agc030f]Permutation and Minimum(动态规划) 题面 atcoder 给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{ ...
- 【BZOJ】1068: [SCOI2007]压缩(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...
- 【AGC030F】Permutation and Minimum DP
题目大意 有一个长度为序列 \(a\),其中某些位置的值是 \(-1\). 你要把 \(a\) 补成一个排列. 定义 \(b_i=\min(a_{2i-1},a_{2i})\),求有多少种可能的 \( ...
- 【51nod1519】拆方块[Codeforces](dp)
题目传送门:1519 拆方块 首先,我们可以发现,如果第i堆方块被消除,只有三种情况: 1.第i-1堆方块全部被消除: 2.第i+1堆方块全部被消除:(因为两侧的方块能够保护这一堆方块在两侧不暴露) ...
- 【bzoj1925】地精部落[SDOI2010](dp)
题目传送门:1925: [Sdoi2010]地精部落 这道题,,,首先可以一眼看出他是要我们求由1~n的排列组成,并且抖来抖去的序列的方案数.然后再看一眼数据范围,,,似乎是O(n^2)的dp?然后各 ...
- 【ZOJ2278】Fight for Food(dp)
BUPT2017 wintertraining(16) #4 F ZOJ - 2278 题意 给定一个10*10以内的地图,和p(P<=30000)只老鼠,给定其出现位置和时间T(T<=1 ...
- 【POJ】3616 Milking Time(dp)
Milking Time Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10898 Accepted: 4591 Des ...
- 【POJ】2385 Apple Catching(dp)
Apple Catching Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13447 Accepted: 6549 D ...
- 【vijos】1764 Dual Matrices(dp)
https://vijos.org/p/1764 自从心态好了很多后,做题的确很轻松. 这种题直接考虑我当前拿了一个,剩余空间最大能拿多少即可. 显然我们枚举每一个点拿出一个矩形(这个点作为右下角), ...
随机推荐
- ubuntu svn 安装
deepin@deepin:~$ sudo apt-get install rabbitvcs-rabbitvcs-cli rabbitvcs-core rabbitvcs-gedit rabbitv ...
- THUPC2019/CTS2019/APIO2019游记
Day -? 居然还能报上thupc,我在队里唯一的作用大约是cfrating稍微高点方便过审.另外两位是lz和xyy. Day -2 我夫人生日! Day -1 lz和xyy的家长都来了带我飞.住在 ...
- IntelliJ IDEA 之 配置JDK 的 4种方式
一.新建项目前配置JDK 打开IDEA集成开发环境工具,点击:File--Project Structure,如下图 在打开的页面中,选择SDKs属性,并点击中间的加号+,选择JDK,如下图 在打开的 ...
- 18-MySQL DBA笔记-MySQL Server调优
第18章 MySQL Server调优 本章将为读者介绍针对MySQL Server的优化,这也是DBA最熟悉的领域之一.首先我们介绍MySQL的主要参数,然后,讲述常见硬件资源的优化.我们假设读者已 ...
- Vue绑定的table页面在Chrome浏览器左右抖动
现象: 今天Chrome浏览器升级到最新版本(75.0.3770.100),突然发现之前vue页面只要绑定了el-table标签的,都在左右抖动,抖动得眼睛都花了,百度上找半天也没有遇到相同问题的人, ...
- 漏洞预警 | ThinkPHP 5.x远程命令执行漏洞
ThinkPHP采用面向对象的开发结构和MVC模式,融合了Struts的思想和TagLib(标签库).RoR的ORM映射和ActiveRecord模式,是一款兼容性高.部署简单的轻量级国产PHP开发框 ...
- zTree插件实现菜单树
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...
- JS 学习书籍电子版PDF下载
JavaScript权威指南(第6版)(中文版) 链接:https://pan.baidu.com/s/1H1v77UY-yh7oDxonRjd0GA 提取码:r3pu JavaScript DOM编 ...
- MySQL: Can’t connect to MySQL server on (111 “Connection refused”)
1. Mysql连接问题 远程访问mysql或者通过docker访问宿主机mysql经常会碰到下面的问题: Can't connect to MySQL server on (111 "Co ...
- friend
#include <iostream> using namespace std; //friend 友元,效率的问题 //get 方法和set方法,是标准封装的结果,friend破坏了这种 ...