【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
样例解释:有两种方案 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; }
| 欢迎来原网站坐坐! >原文链接<