标签:ons src ++ bzoj ios blank str 个数 line
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4321
题意:给一个数,找出所有相邻两数大小不相邻的排列数。
考虑一下,用$f[i][j][k]$表示当前已经插入$i$个数,出现了$j$对相邻数字大小相邻的情况,$k==1$表示最后两个数字大小相邻,反之则不相邻。
思考一个新的状态如何由已知状态转移而来。
对于$f[i][j][0]$:
对于$f[i][j][i]$:
然后就正常写就行了……注意开滚动数组压内存……
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int maxn=1005,mod=7777777; 7 long long f[2][maxn][2];int n; 8 int haha() 9 { 10 scanf("%d",&n);f[1][0][0]=1; 11 for(int i=2;i<=n;i++) 12 { 13 int now=i&1; 14 for(int j=0;j<i;j++) 15 { 16 f[now][j][1]=f[now^1][j][1]; 17 if(j)f[now][j][1]=(f[now][j][1]+f[now^1][j-1][1]%mod)%mod; 18 if(j)f[now][j][1]=(f[now][j][1]+f[now^1][j-1][0]*2%mod)%mod; 19 f[now][j][0]=f[now^1][j+1][1]*j%mod; 20 f[now][j][0]=(f[now][j][0]+f[now^1][j+1][0]*(j+1)%mod)%mod; 21 f[now][j][0]=(f[now][j][0]+f[now^1][j][1]*(i-j-1)%mod)%mod; 22 f[now][j][0]=(f[now][j][0]+f[now^1][j][0]*(i-j-2)%mod)%mod; 23 } 24 } 25 printf("%lld\n",f[n&1][0][0]); 26 } 27 int sb=haha(); 28 int main(){;}
标签:ons src ++ bzoj ios blank str 个数 line
原文地址:http://www.cnblogs.com/Loser-of-Life/p/7780340.html