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

题面

atcoder

给定一个长度为\(2n\)的残缺的排列\(A\),定义\(b_i=min\{A_{2i-1},A_{2i}\}\),求有多少种不同的\(b\)。

题解

考虑这个\(b\)的取值是两两配对之后求\(min\),所以我们把所有的数按照从大往小处理,这样子就可以在每一对数填好的时候计算贡献。

首先把已经确定的\(b\)直接丢掉。这样子剩下了若干个填了一半和没有填的对。

设\(f[i][j][k]\)表示当前考虑到第\(i\)个数,还剩下\(j\)对填了一个数的\((-1,-1)\)对和\(k\)对未匹配的\((x,-1)\)对。

暂时不用考虑对与对之间的顺序关系,最后把由两个\(-1\)组成的配对拿出来乘一个阶乘就好了。

考虑新加入的这个数。它有两种贡献,第一种是和一个填了一半的进行配对,另外一个是自己产生一个填了一半的配对。

分类讨论,考虑它是不是\((x,-1)\)对中的一个\(x\)。

如果不是,那么可以考虑填入一个\((-1,-1)\)对中的一个,那么转移到\(f[i][j+1][k]\),要么匹配掉一个\((-1,-1)\)对,变成\(f[i][j-1][k]\),要么匹配一个\((x,-1)\)对,这里有\(k\)种匹配方法,所以乘\(k\)后转移到\(f[i][j][k-1]\)。

如果是,那么要么不匹配,转移到\(f[i][j][k+1]\),要么拉一个填了一半的\((-1,-1)\)对过来,转移到\(f[i][j-1][k]\)。

#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 1000000007
#define MAX 305
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,m,ans,a[MAX<<1];
int cnt1,cnt2,f[MAX<<1][MAX][MAX];
int S[MAX<<1];
bool vis[MAX<<1],book[MAX<<1];
int main()
{
n=read();
for(int i=1;i<=n+n;++i)a[i]=read();
for(int i=1;i<=n+n;i+=2)
if(a[i]==-1&&a[i+1]==-1)++cnt1;
else if(a[i]>0&&a[i+1]>0)vis[a[i]]=vis[a[i+1]]=true;
else ++cnt2,book[(~a[i])?a[i]:a[i+1]]=true;
for(int i=n+n;i;--i)if(!vis[i])S[++m]=i;
f[0][0][0]=1;
for(int i=1;i<=m;++i)
for(int j=0;j<=cnt1+cnt2;++j)
for(int k=0;k<=cnt2;++k)
{
if(!f[i-1][j][k])continue;
if(!book[S[i]])
{
add(f[i][j+1][k],f[i-1][j][k]);
if(j)add(f[i][j-1][k],f[i-1][j][k]);
if(k)add(f[i][j][k-1],1ll*k*f[i-1][j][k]%MOD);
}
else
{
add(f[i][j][k+1],f[i-1][j][k]);
if(j)add(f[i][j-1][k],f[i-1][j][k]);
}
}
ans=f[m][0][0];for(int i=1;i<=cnt1;++i)ans=1ll*ans*i%MOD;
printf("%d\n",ans);
return 0;
}

【agc030f】Permutation and Minimum(动态规划)的更多相关文章

  1. AtCoder Grand Contest 030 (AGC030) F - Permutation and Minimum 动态规划

    原文链接www.cnblogs.com/zhouzhendong/p/AGC030F.html 草率题解 对于每两个相邻位置,把他们拿出来. 如果这两个相邻位置都有确定的值,那么不管他. 然后把所有的 ...

  2. AGC030F - Permutation and Minimum

    https://atcoder.jp/contests/agc030/tasks/agc030_f 题解 我们先把这个排列从\(1 \sim 2n\)表达出来,然后题面中的每一对数我们可以用一条线把他 ...

  3. 【AGC030F】Permutation and Minimum DP

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

  4. 【AGC030F】Permutation and Minimum(DP)

    题目链接 题解 首先可以想到分组后,去掉两边都填了数的组. 然后就会剩下\((-1,-1)\)和\((-1,x)\)或\((x,-1)\)这两种情况 因为是最小值序列的情况数,我们可以考虑从大到小填数 ...

  5. Atcoder Grand Contest 030 F - Permutation and Minimum(DP)

    洛谷题面传送门 & Atcoder 题面传送门 12 天以前做的题了,到现在才补/yun 做了一晚上+一早上终于 AC 了,写篇题解纪念一下 首先考虑如果全是 \(-1\)​ 怎么处理.由于我 ...

  6. AtCoder Grand Contest 030题解

    第一次套刷AtCoder 体验良好 传送门 Poisonous Cookies cout<<b+min(c,a+b+); Tree Burning 难度跨度有点大啊 可以证明当第一次转向之 ...

  7. AGC030 简要题解

    A - Poisonous Cookies 题意 有\(A\)个能解毒的普通饼干,\(B\)个能解毒的美味饼干,\(C\)个有毒的美味饼干,求最多能吃多少个美味饼干,每次吃完有毒的饼干后要解毒后才能继 ...

  8. 【AtCoder】AGC030

    A - Poisonous Cookies 有毒还吃,有毒吧 #include <bits/stdc++.h> #define fi first #define se second #de ...

  9. [LeetCode] Unique Paths && Unique Paths II && Minimum Path Sum (动态规划之 Matrix DP )

    Unique Paths https://oj.leetcode.com/problems/unique-paths/ A robot is located at the top-left corne ...

随机推荐

  1. 【学习总结】GirlsInAI ML-diary day-6-String字符串

    [学习总结]GirlsInAI ML-diary 总 原博github链接-day6 认识字符串 字符串的性质 字符串的玩法 1-字符串就是字符的序列 序列,代表字符串是有顺序的!这里很重要. 比如我 ...

  2. yum 命令

    yum( Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器. 基於RPM包管理,能够从指定的服务器自动下载RPM包 ...

  3. Azure系列2.1.2 —— BlobContainerProperties

    (小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...

  4. Angular 自定义指令传参

    <!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...

  5. elasticsearch介绍,安装,安装错误解决及相应插件安装

    一.elasticsearch介绍 1.简介(使用的是nosql,更新比mongodb慢): ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎, ...

  6. Linux基础学习(13)--Linux系统管理

    第十三章——Linux系统管理 一.进程管理 1.进程查看: (1)进程简介:进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源. (2)进程管理的 ...

  7. 集合之LinkedHashMap(含JDK1.8源码分析)

    一.前言 大多数的情况下,只要不涉及线程安全问题,map都可以使用hashMap,不过hashMap有一个问题,hashMap的迭代顺序不是hashMap的存储顺序,即hashMap中的元素是无序的. ...

  8. python学习 第二天

    一.变量 1.变量名: 数字,字母,下划线 alex1=123 sb=“alex” a_lex=“sb” 不能以数字开头 lalex 变量名不是python内部的关键字 {‘and’,'as','as ...

  9. JQ 动态修改/替换某个节点的内容

     <div class="box">我们定位于中国心理行业第一<div> $(".box").html($(".box&quo ...

  10. nginx rewrite重写

    通过官方文档可以看到,rewrite的作用上下文是   server location,可以写在 server里面  亦或location里面; 命令: if (条件) {} 条件判断 set #设置 ...