【BZOJ4321】queue2 DP

【BZOJ4321】queue2

Description

n 个沙茶,被编号 1~n。排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 1(+1 或-1)就行; 
现在想知道,存在多少方案满足沙茶们如此不苛刻的条件。 

Input

只有一行且为用空格隔开的一个正整数 N,其中 100%的数据满足 1≤N ≤ 1000; 

Output

一个非负整数,表示方案数对 7777777 取模。    

Sample Input

4

Sample Output

2
样例解释:有两种方案 2 4 1 3 和 3 1 4 2

题解:常见的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;
}
 
posted @ 2017-10-28 16:10  CQzhangyu  阅读(305)  评论(0编辑  收藏  举报