很水的DP
把\(E\)丢掉,就可以发现原来的环变成了一个以\(A\)为中点,两边对称的链。
这个时候\(B\)和\(H\)的答案是一样的,\(G\)和\(C\)是一样的,\(F\)和\(D\)是一样的。
那么我们就没有必要再去重复的求答案,原来的\(8\)个点被压成了\(4\)个点。
设\(dp[x,y]\)为从\(A\)点到\(y\)点路程为\(x\)的方案总数。
状态转移方程为
\[dp[x,y]=dp[x-1,y-1]+dp[x-1,y+1]\]
\[dp[0,1]=1\]
记得转移的时候要此时是否是链的边界
再用滚动数组优化即可
PS:这题该怎么矩阵快速幂啊 如有dalao了解请私信小蒟蒻
#include <cstdio>
const int mod = 1e3;
int N;
int dp[2][5];
int main()
{
scanf("%d", &N);
dp[0][1] = 1;
for(int i = 1, pos = 1; i <= N; ++i, pos ^= 1)
for(int j = 1; j <= 4; ++j)
dp[pos][j] = (dp[pos ^ 1][(j == 1) ? 2 : j - 1] + dp[pos ^ 1][(j == 4) ? 0 : j + 1]) % mod;
printf("%d\n", (dp[(N & 1) ^ 1][4] << 1) % mod);
return 0;
}