n 个沙茶,被编号 1~n。排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行;
现在想知道,存在多少方案满足沙茶们如此不苛刻的条件。
标签:string ring space can std ios 一个人 解释 自己的
题解:常见的DP方式:
我们将n个数从小到大一个一个加入队列中,那么第n个人只有与第n-1个人在一起才是不合法的,所以我们记录f[i][j][0/1]表示前i个人,相邻的不合法的对数是j,第i个人和第i-1个人是否相邻 的方案数。那么转移方程也很容易得出。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const ll P=7777777; int n; ll f[1010][1010][2]; int main() { f[2][1][1]=2; int i,j; scanf("%d",&n); for(i=3;i<=n;i++) { for(j=0;j<i;j++) { f[i][j][0]=((i-j-2)*f[i-1][j][0]+(j+1)*f[i-1][j+1][0]+(i-j-1)*f[i-1][j][1]+(j)*f[i-1][j+1][1])%P; if(j) f[i][j][1]=(2*f[i-1][j-1][0]+f[i-1][j][1]+f[i-1][j-1][1])%P; } } printf("%lld",f[n][0][0]); return 0; }
标签:string ring space can std ios 一个人 解释 自己的
原文地址:http://www.cnblogs.com/CQzhangyu/p/7747205.html