周赛 一步两步 题解(dp)

题目链接

题目思路

其实是一个很简单的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;
}

发布了68 篇原创文章 · 获赞 2 · 访问量 2269

猜你喜欢

转载自blog.csdn.net/m0_46209312/article/details/104883915
今日推荐