标签:
对于 20%的数据,满足 N≤10;
对于 40%的数据,满足 N≤18;
对于 70%的数据,满足 N≤550;
对于 100%的数据,满足 3≤N≤4200,P≤109
【思路】
DP+滚动数组
设f[i][j]表示长度为i且以1..j为开头,且开头为下降的总方案数,则有方程式:
f[i][j]=f[i][j-1]+f[i-1][i-j]
第一部分考虑长度为i且开头为1..j-1的方案数。
第二部分考虑以j为开头的序列,则应该接上f[i-1][j-1],但这样就变成了上升序列,考虑到上升序列和下降序列是对称的,取一下反,那么f[i-1][j-1]=f[i-1][i-j]。
答案为f[n][n]*2,上升和下降。
最后滚动数组优化空间。
【代码】
1 #include<cstdio> 2 using namespace std; 3 4 const int N = 5000; 5 6 int f[2][N],n,m; 7 8 int main() { 9 scanf("%d%d",&n,&m); 10 f[1][1]=1; 11 for(int i=2;i<=n;i++) 12 for(int j=1;j<=i;j++) 13 f[i&1][j]=(f[i&1][j-1]+f[(i&1)^1][i-j])%m; 14 printf("%d",(f[n&1][n]*2)%m); 15 return 0; 16 }
标签:
原文地址:http://www.cnblogs.com/lidaxin/p/5222897.html