【bzoj2302】【HAOI2011】problem c
2017-10-06 19:32
387 查看
题意
有一条长度为n的链和n个人,每个人有一个编号ai
从第一个人开始往后,每个人首先站在ai号点上,如果此点有人,那么就往后站,ai+1,ai+2,……一直到n号点,如果这个人依旧没有站好,则该方案不合法
已知有m个人确定了编号(编号可以相同),求合法的方案数
解法
DP:
设fi,j表示编号≤i的有j个人时的方案数,qi表示编号为i的人有多少个,si表示编号≤i的人可以(最多)有多少个
首先判断是否有合法的方案:如果∃i∈【1,n】,有sumi<i,那么不存在合法方案,即对于∀i∈【1,n】,都要求sumi≥i
然后开始进行递推:
fi,j=∑k=qij−i+1fi−1,j−k∗Ck−qisi−qi−(j−k)
现在有si个人,qi个人已经确定必须选,j−k个人已经选完了,在剩下的人中选出k−qi个人使其编号为i
最后fn,n就是答案
复杂度
O(T∗n3)
代码
有一条长度为n的链和n个人,每个人有一个编号ai
从第一个人开始往后,每个人首先站在ai号点上,如果此点有人,那么就往后站,ai+1,ai+2,……一直到n号点,如果这个人依旧没有站好,则该方案不合法
已知有m个人确定了编号(编号可以相同),求合法的方案数
解法
DP:
设fi,j表示编号≤i的有j个人时的方案数,qi表示编号为i的人有多少个,si表示编号≤i的人可以(最多)有多少个
首先判断是否有合法的方案:如果∃i∈【1,n】,有sumi<i,那么不存在合法方案,即对于∀i∈【1,n】,都要求sumi≥i
然后开始进行递推:
fi,j=∑k=qij−i+1fi−1,j−k∗Ck−qisi−qi−(j−k)
现在有si个人,qi个人已经确定必须选,j−k个人已经选完了,在剩下的人中选出k−qi个人使其编号为i
最后fn,n就是答案
复杂度
O(T∗n3)
代码
#include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #define Lint long long int using namespace std; const Lint INF=0x3f3f3f3f; const int MAXN=310; Lint c[MAXN][MAXN],f[MAXN][MAXN]; int s[MAXN],q[MAXN]; int n,m,M,T; void Prepare() { c[0][0]=1; for(int i=1;i<=n;i++) { c[i][0]=1; for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%M; } } bool init() { for(int i=1;i<=n;i++) { s[i]=s[i-1]+q[i]; if( s[i]<i ) return false ; } return true ; } int main() { scanf("%d",&T); while( T-- ) { scanf("%d%d%d",&n,&m,&M); Prepare(); memset( f,0x0,sizeof f ),memset( q,0x0,sizeof q ); for(int i=1,u,x;i<=m;i++) { scanf("%d%d",&u,&x); q[x]++; } s[0]=n-m; if( !init() ) { printf("NO\n");continue ; } f[0][0]=1; for(int i=1;i<=n;i++) for(int j=s[i];j>=i;j--) for(int k=j-i+1;k>=q[i];k--) f[i][j]=(f[i][j]+f[i-1][j-k]*c[s[i]-q[i]-(j-k)][k-q[i]])%M; printf("YES %lld\n",f ); } return 0; }
相关文章推荐
- BZOJ2302 [HAOI2011]Problem c
- BZOJ2302 [HAOI2011]Problem c
- Bzoj2302--Haoi2011Problem c
- BZOJ2302: [HAOI2011]Problem c
- BZOJ2302 [HAOI2011]Problem c 【dp】
- BZOJ2302: [HAOI2011]Problem c
- bzoj 2302: [HAOI2011]Problem c
- bzoj2302 [HAOI2011]Problem c
- bzoj 2302: [HAOI2011]Problem c
- bzoj2302: [HAOI2011]Problem c
- 2302: [HAOI2011]Problem c
- BZOJ 2302 HAOI2011 Problem c 动态规划
- [BZOJ2302][HAOI2011]Problem c(DP+组合数学)
- BZOJ 2302: [HAOI2011]Problem c [DP 组合计数]
- 【53.61%】【BZOJ 2302】[HAOI2011]Problem c
- 【bzoj2302】【HAOI2011】【problem c】【dp】
- bzoj 2302: [HAOI2011]Problem c dp+数学
- [HAOI2011][BZOJ2302] problem C 组合数+动态规划
- BZOJ2302: [HAOI2011]Problem c|动态规划|组合数学
- bzoj 2302: [HAOI2011]Problem c(DP)