[ARC053D]2 つの山札
题意:给定排列$a_{1\cdots n},b_{1\cdots n}$,执行以下操作$2n-2$次来生成一个长度为$2n-2$的序列:选择$a,b$之一(选择的序列长度要$\geq2$),删除它的第一个数字并将另一个序列的第一个数字加到生成的序列的末尾,问最后能生成多少种不同的序列
首先是一个转化,画一个$n\times n$的网格,第$i$行的$n-1$条边上的数字为$a_i$,第$i$列的$n-1$条边上的数字为$b_i$,一个生成的序列对应着这个网格上从左上角到右下角的一条路径上的数字
对于$a=\{3,1,4,2,5\},b=\{3,2,4,1,5\}$,题解给了以上这张对应的图
考虑DP,设$f_{i,j}$表示走到$(i,j)$的不同方案数,直接转移就是$f_{i,j}=f_{i-1,j}+f_{i,j-1}$,但如果$a_i=b_j$,那么这样可能产生重复
考虑所有使得$a_{i-k}=b_{j-k}(k\geq1)$的$k$,如果从某个$(i-k,j-k)$走到$(i,j)$只经过这些$(i-k',*)$和$(*,j-k')$,那么一条从$(i-k,j-k)$到$(i,j)$且不碰对角线的路径,沿对角线对称可以得到路径不同但得到数列相同的方案,我们要减去这些方案,即$\sum\limits_{k\geq1}[a_{i-k}=b_{i-k}]f_{i-k,j-k}C_{t-1}$,其中$C_n$是卡特兰数,$t$为当前是第几个满足要求的$k$
答案即为$f_{n,n}$,因为只会有$n$对$a_i=b_j$,所总时间复杂度为$O(n^2)$
#include<stdio.h> typedef long long ll; const int mod=1000000007; int mul(int a,int b){return(ll)a*b%mod;} int pow(int a,int b){ int s=1; while(b){ if(b&1)s=mul(s,a); a=mul(a,a); b>>=1; } return s; } int fac[2010],rfac[2010]; void pre(int n){ int i; fac[0]=1; for(i=1;i<=n;i++)fac[i]=mul(fac[i-1],i); rfac[n]=pow(fac[n],mod-2); for(i=n;i>0;i--)rfac[i-1]=mul(rfac[i],i); } int C(int n){return mul(fac[2*n],mul(rfac[n],rfac[n+1]));} int a[1010],b[1010],f[1010][1010]; int main(){ int n,i,j,k,s; scanf("%d",&n); pre(n*2); for(i=1;i<=n;i++)scanf("%d",a+i); for(i=1;i<=n;i++)scanf("%d",b+i); f[1][1]=1; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i>1||j>1)f[i][j]=(f[i-1][j]+f[i][j-1])%mod; if(a[i]==b[j]){ s=0; for(k=1;i-k>0&&j-k>0;k++){ if(a[i-k]==b[j-k])(f[i][j]-=mul(C(s++),f[i-k][j-k]))%=mod; } } } } printf("%d",(f[n][n]+mod)%mod); }
[ARC053D]2 つの山札的更多相关文章
- AT1879 2 つの山札
题面 题解 直接求解比较麻烦,考虑将问题进行转化. 设序列\(a = \{3, 1, 4, 2, 5\}, b = \{3, 2, 4, 1, 5\}\),那么我们构造一个正方形方格,将\(a\)放在 ...
- HDU2063 过山车
过山车 RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是, ...
- HDOJ 2063 过山车
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- Xamarin.Android之山有木兮之木有枝,心悦君兮君不知。
Xamarin.Android之山有木兮之木有枝,心悦君兮君不知. 第一步,写项目中的第一个界面. <?xml version="1.0" encoding =" ...
- hdu 2063 过山车(匈牙利算法模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others) Memory ...
- HDU- 2063 过山车
http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车//我的第一个二分匹配 Time Limit: 1000/1000 MS (Java/Others) ...
- hdoj 2063 过山车【匈牙利算法+邻接矩阵or邻接表】
过山车 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- centos 6+安装山逗斯骚尅特(本文内容来自都比更具帝)
系统支持:CentOS 6+,Debian 7+,Ubuntu 12+ 内存要求:≥128M 关于本脚本 一键安装 Shadowsocks-Python, ShadowsocksR, Shadowso ...
- 大龄剩女四大结局:孤寡 后妈 拉拉 出家 宽带山KDS-宽带山社区-第一城市消费门户
大龄剩女四大结局:孤寡 后妈 拉拉 出家 宽带山KDS-宽带山社区-第一城市消费门户 主题:大龄剩女四大结局:孤寡 后妈 拉拉 出家
随机推荐
- Python中单引号,双引号,三引号
1.单引号与双引号的区别 s1=‘let‘s go’(明显我们是想用单引号表示let’s go这个字符串的,但是python只知道用‘’来表示字符串,所以python就把字符串中的‘字符当成单引号处理 ...
- 2017百越杯反序列化writeup
去年的了,之前也有研究过.只是因为感觉PHP反序列化挺好玩的所以就再研究了一遍.总之感觉反序列化漏洞挺好玩的. 题目代码: <?php class home{ private $method; ...
- linux驱动开发:用户空间操作LCD显示简单的图片【转】
转自:http://blog.csdn.net/changliang7731/article/details/53074616 上一章我们简单介绍了LCD的一些基本原理.当然更深奥的还有,比如gamm ...
- elk系列1之入门安装与基本操作【转】
preface 我们每天都要查看服务器的日志,一方面是为了开发的同事翻找日志,另一方面是巡检服务器查看日志,而随着服务器数量以及越来越多的业务上线,日志越来越多,人肉运维相当痛苦了,此时,参考现在非常 ...
- python使用unittest模块selenium访问斗鱼获取直播信息
import unittest from selenium import webdriver from bs4 import BeautifulSoup as bs class douyu(unitt ...
- C++ 模版的优点和缺点
优点: 1. 灵活性, 可重用性和可扩展性; 2. 可以大大减少开发时间,模板可以把用同一个算法去适用于不同类型数据,在编译时确定具体的数据类型; 3. 模版模拟多态要比C++类继承实现多态效率要高, ...
- 报错:Cobbler check 时报错
报错:[root@test88 ~]# cobbler checkTraceback (most recent call last): File "/usr/bin/cobbler&quo ...
- java版云笔记(三)
登录与注册写好了下来就是主页,今天写的是主页加载时笔记本列表的显示,ajax是固定的就不重点说了.主要说一下jQuery.data() 函数和jQuery.on() 函数. 注:这个项目的sql文件, ...
- Java-悲观锁和乐观锁
Java中的乐观锁与悲观锁: 1. Java中典型的synchronized就是一种悲观锁,也就是独占锁,不过JDK1.6之后对synchronized已经做了许多优化,也不能说是完全的悲观锁了: 2 ...
- Python解释器【转载】
原文链接 0x01 简介 当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 0x02 Python ...