舔狗舔到最后一无所有(DP)

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define go continue
#define int long long
#define PII pair<int, int>
#define sf(x) scanf("%lld",&x)
#define pf(x) printf("%lld\n",x)
#define ytz int _; sf(_); while(_--)
#define fory(i,a,b) for(int i = a; i <= b; ++i)
#define forl(i,a,b) for(int i = a; i >= b; --i)
#define debug(a) cout << #a << " = " << a <<endl;

const int mod = 1e9 + 7;
const int N = 100010;
/**\
https://ac.nowcoder.com/acm/contest/24213/1002

f[i][j] 表示前i天中且第i天去第j家的方案数
以f[i][0]为例, 第i天去第0家,我们讨论第i - 1天是否去了第0家
1、i - 1天 不去第0家 : f[i][0] += f[i - 1][1] + f[i - 1][2]
2、i - 1天 去第0家   : f[i][0] += f[i - 2][1] + f[i - 2][2]  第i - 2天不能去第0家,不然就连续三天吃了同一家
\**/
int n, f[N][3];

signed main()
{
    f[0][0] = f[0][1] = f[0][2] = 0;
    f[1][0] = f[1][1] = f[1][2] = 1;
    f[2][0] = f[2][1] = f[2][2] = 3;
    fory(i, 3, 100000)
    {
        f[i][0] = (f[i - 1][1] + f[i - 1][2] + f[i - 2][1] + f[i - 2][2]) % mod;
        f[i][1] = (f[i - 1][0] + f[i - 1][2] + f[i - 2][0] + f[i - 2][2]) % mod;
        f[i][2] = (f[i - 1][0] + f[i - 1][1] + f[i - 2][0] + f[i - 2][1]) % mod;
    }
    ytz
    {
        int x;
        sf(x);
        printf("%lld\n", (f[x][0] + f[x][1] + f[x][2]) % mod);
    }

    return 0;
}

 

posted @ 2022-03-08 11:12  std&ice  阅读(84)  评论(0编辑  收藏  举报