标签:数组 geo names images mic src 工作 [1] 其他
对于 20%的数据,满足 N≤10;
对于 40%的数据,满足 N≤18;
对于 70%的数据,满足 N≤550;
对于 100%的数据,满足 3≤N≤4200,P≤109
题解:容易发现这是一个基于奇偶性的DP,那么我们就分就来讨论一下。
设f[i][0/1]表示有i段,其中最左边那一段是山谷/山峰的方案数,那么我们假设前i-1段已经放好了,现在我们枚举第i段加入的位置,然后将左右两边的方案数乘起来,别忘了在乘上一个组合数。
还有这题P不是质数不能用逆元,只能n2求组合数,但是空间64MB开不下,所以要用滚动数组边DP边求组合数。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; int n; ll f[4300][2],c[2][4300],mod; int main() { f[0][0]=f[0][1]=f[1][0]=c[1][0]=1; scanf("%d%lld",&n,&mod); int i,j; for(i=2;i<=n;i++) { c[i&1][0]=1; for(j=1;j<i;j++) c[i&1][j]=(c[(i&1)^1][j-1]+c[(i&1)^1][j])%mod; for(j=0;j<i;j++) (f[i][(j&1)^1]+=c[i&1][j]*f[j][(j&1)^1]%mod*f[i-j-1][0]%mod)%=mod;q } printf("%lld",(f[n][0]+f[n][1])%mod); return 0; }
【BZOJ1925】[Sdoi2010]地精部落 组合数+DP
标签:数组 geo names images mic src 工作 [1] 其他
原文地址:http://www.cnblogs.com/CQzhangyu/p/7008225.html