[DP] BZOJ4321. queue2

来源:互联网 发布:新手可以做淘宝代销吗 编辑:程序博客网 时间:2024/06/05 08:51

套路DP…这种和相邻数有关的一般考虑从小到大插入。
fi,j,0/1 表示放了前 i 个数,有 j 个间隙两数相邻,0/1 表示 ii1 是否相邻。就好了。

#include<cstdio>#include<algorithm>using namespace std;const int maxn=1005,MOD=7777777;typedef long long LL;LL f[maxn][maxn][2];int n;int main(){    //freopen("bzoj4321.in","r",stdin);    //freopen("bzoj4321.out","w",stdout);    scanf("%d",&n);    f[1][0][0]=1;    for(int i=1;i<=n-1;i++)     for(int j=0;j<=i-1;j++)       for(int k=0;k<=1;k++) if(f[i][j][k]){        if(k>0) (f[i+1][j][1]+=f[i][j][k])%=MOD;        (f[i+1][j+1][1]+=f[i][j][k]*(2-k)%MOD)%=MOD;        if(j-k>0) (f[i+1][j-1][0]+=f[i][j][k]*(j-k)%MOD)%=MOD;        if(i+1-(j-k)-2>0) (f[i+1][j][0]+=f[i][j][k]*(i+1-(j-k)-2)%MOD)%=MOD;       }    printf("%lld\n",f[n][0][0]);    return 0; } 
原创粉丝点击