题目大意:求1~n的序列,满足一个数的左右两边的差的绝对值不等与1的方案数
题解:f[i][j][0/1]表示前i个数j对相邻,i和i−1相邻与否
然后Orz题解
我的收获:状态神啊,分类讨论神啊
,完全不会啊
#include <cstdio>
#include <iostream>
#include <cmath>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
#define M 1005
#define ll long long
#define P 7777777
int n;
ll f[M][M][2];
void DP()
{
f[1][0][0]=1;
for(int i=2;i<=n;i++)
for(int j=0;j<=n;j++)
{
f[i][j][1]=(f[i-1][j][1]+f[i-1][j-1][1]+f[i-1][j-1][0]*2)%P;
f[i][j][0]=(f[i-1][j+1][1]*j+f[i-1][j+1][0]*(j+1))%P;
f[i][j][0]=(f[i][j][0]+f[i-1][j][1]*(i-j-1)+f[i-1][j][0]*(i-j-2))%P;
}
}
void work()
{
DP();
printf("%lld\n",f[n][0][0]);
}
void init(){
cin>>n;
}
int main()
{
init();
work();
return 0;
}