题目链接
题目思路
其实是一个很简单的dp,但是不知道为什么自己又没有思路,dp杀我
我们注意每一次移动只能往相邻的顶点移动一位,因此我们可以考虑 dp。
二维dp[ i ][ j ] 表示第 i步站在 j 这个顶点的方案数,然后可以发现它是从 ( 与 j为相邻顶点)转移 过来。
给顶点标号
还要注意会卡空间。必须一维数组
代码
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
const int mod=1e9+7;
int n;
ll dp1[9],dp2[9];
int main(){
dp2[1]=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
dp1[1]=(dp2[2]+dp2[4]+dp2[5])%mod;
dp1[2]=(dp2[1]+dp2[3]+dp2[6])%mod;
dp1[3]=(dp2[2]+dp2[4]+dp2[8])%mod;
dp1[4]=(dp2[1]+dp2[3]+dp2[7])%mod;
dp1[5]=(dp2[1]+dp2[6]+dp2[7])%mod;
dp1[6]=(dp2[2]+dp2[5]+dp2[8])%mod;
dp1[7]=(dp2[4]+dp2[5]+dp2[8])%mod;
dp1[8]=(dp2[3]+dp2[6]+dp2[7])%mod;
swap(dp1,dp2);
}
printf("%lld",dp2[1]);
return 0;
}