题意:给定排列$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 つの山札的更多相关文章

  1. AT1879 2 つの山札

    题面 题解 直接求解比较麻烦,考虑将问题进行转化. 设序列\(a = \{3, 1, 4, 2, 5\}, b = \{3, 2, 4, 1, 5\}\),那么我们构造一个正方形方格,将\(a\)放在 ...

  2. HDU2063 过山车

    过山车 RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是, ...

  3. HDOJ 2063 过山车

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  4. Xamarin.Android之山有木兮之木有枝,心悦君兮君不知。

    Xamarin.Android之山有木兮之木有枝,心悦君兮君不知. 第一步,写项目中的第一个界面. <?xml version="1.0" encoding ="  ...

  5. hdu 2063 过山车(匈牙利算法模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory ...

  6. HDU- 2063 过山车

    http://acm.hdu.edu.cn/showproblem.php?pid=2063 过山车//我的第一个二分匹配 Time Limit: 1000/1000 MS (Java/Others) ...

  7. hdoj 2063 过山车【匈牙利算法+邻接矩阵or邻接表】

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  8. centos 6+安装山逗斯骚尅特(本文内容来自都比更具帝)

    系统支持:CentOS 6+,Debian 7+,Ubuntu 12+ 内存要求:≥128M 关于本脚本 一键安装 Shadowsocks-Python, ShadowsocksR, Shadowso ...

  9. 大龄剩女四大结局:孤寡 后妈 拉拉 出家 宽带山KDS-宽带山社区-第一城市消费门户

    大龄剩女四大结局:孤寡 后妈 拉拉 出家 宽带山KDS-宽带山社区-第一城市消费门户 主题:大龄剩女四大结局:孤寡 后妈 拉拉 出家

随机推荐

  1. hdu 5373 The shortest problem(杭电多校赛第七场)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5373 The shortest problem Time Limit: 3000/1500 MS (J ...

  2. 初识smarty

    个人体会(不完全正确):就是smarty就是为了更好的使得php/html结合做出来的一个框架. ,

  3. 70.如何在xilinx SDK中显示行号

    Window→preferences→editor→test editor 对ecilpse的通用方法 打开Eclipse软件,在菜单中选择窗口——首选项,打开新的窗口. 在新的窗口中依次选择常规—— ...

  4. onvif客户端

    前言 做开发有8年时间了,ffmpeg和onvif与我是特别有缘的了(说着玩的,我更认为是因为他们确实强大^_^). ffmpeg在毕业设计时就有用到,5年后做windows.linux播放库时又有用 ...

  5. Linux命令学习手册-route命令

    route [-CFvnee] route [-v]  [-A family] add [-net|-host] target [netmask Nm] [gw Gw] [metric N] [mss ...

  6. C/C++——C语言库函数大全

    本文转载自:https://blog.csdn.net/yanfan0916/article/details/6450442###; 1. 分类函数: ctype.h  int isalpha(int ...

  7. swiper (Table切换和动态加载时候出现的问题)

    本文为让心灵-去旅行原创,转载请说明.. 我们在写一个简单的swiper图片轮播的时候很简单,是写死的也就那么几张图片轮播.如果这时候图片和一些东西是后台的,你从js里动态添加到DOM时,这时候你就会 ...

  8. fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s",name); buff为字符数组

    fprintf输出到文件中,sprintf输出到字符串中. 如: fprintf(fp,"%s",name); fp为文件指针 sprintf(buff,"%s" ...

  9. 交通运输线(LCA)

    题目大意: 战后有很多城市被严重破坏,我们需要重建城市.然而,有些建设材料只能在某些地方产生.因此,我们必须通过城市交通,来运送这些材料的城市.由于大部分道路已经在战争期间完全遭到破坏,可能有两个城市 ...

  10. POJ 1511 Invitation Cards(Dijkstra(优先队列)+SPFA(邻接表优化))

    题目链接:http://poj.org/problem?id=1511 题目大意:给你n个点,m条边(1<=n<=m<=1e6),每条边长度不超过1e9.问你从起点到各个点以及从各个 ...