职业摆烂人


私信TA

用户名:uq_59495985965

访问量:6088

签 名:

等  级
排  名 892
经  验 3390
参赛次数 0
文章发表 18
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

TA的其他文章

解题思路:

https://www.bilibili.com/video/BV18i4y1D7cJ?spm_id_from=333.999.0.0

1:05:00开始看

map[j][k]    相当于是一张表格,如果左边一列开始是已j的状态的,那么k为该状态下的放法

a[i][k]        表示第i列时所处于的k种状态

所以当i+1时若要处于的k状态,就要看前一列出与j状态的情况下,是否在map中能找到,使得格子能从第j中状态转换到第k中状态的方式。

f开空间可能会过大,用循环数组,&1相当于%2;


看代码的大佬能讲解一下为什么将    int f[2][4]放在主函数里面会报错吗?


参考代码:

#include<iostream>
#include<cstring>
using namespace std;
int map[4][4]={
    {1,1,1,1},
    {0,0,1,1},
    {0,1,0,1},
    {1,0,0,0},
};
int f[2][4];
int main()
{
    int n;
    cin>>n;
    f[1][0]=1;
    for(int i=1;i<=n;i++)
    {
        memset(f[(i+1)&1],0,sizeof(f[0]));
        for(int j=0;j<4;j++)
        {
            for(int k=0;k<4;k++)
            {
                f[(i+1)&1][k]=(f[(i+1)&1][k]+f[i&1][j]*map[j][k])%1000000007;
            }
        }
    }
    cout<<f[(n+1)&1][0]<<endl;
    return 0;
}


 

0.0分

2 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答

代码解释器

  评论区