51nod2657二進制數字

2657 二進制數字
題目大意:長度爲nn0101串,問總共有多少串滿足不含三個連續的0011n<=1e5n<=1e5,輸出答案取餘1e9+71e9+7

方法一:找規律,可以發現a[i]=a[i1]+a[i2]a[i]=a[i-1]+a[i-2]
方法二:由於每個位置的01狀態只由前面兩個位置的01狀態推導,方案數也是由前兩個位置的01狀態轉移,所以可以用DP解決

ll dp[100010][2][2];
/*
dp[i][0][0]//前面一個是0的方案數
dp[i][0][1]//前面兩個都是0的方案數
dp[i][1][0]//前面一個是1的方案數
dp[i][1][1]//前面兩個都是1的方案數
*/
int main()
{
    IOS;
    int n;
    cin >> n;
    dp[1][0][0] = 1;
    dp[1][1][0] = 1;

    for (int i = 2; i <= n; i++)
    {
        if (dp[i - 1][0][1])
        {
            dp[i][1][0] += dp[i - 1][0][1];
        }
        if (dp[i - 1][0][0])
        {
            dp[i][1][0] += dp[i - 1][0][0];
            dp[i][0][1] += dp[i - 1][0][0];
        }
        if (dp[i - 1][1][1])
        {
            dp[i][0][0] += dp[i - 1][1][1];
        }
        if (dp[i - 1][1][0])
        {
            dp[i][1][1] += dp[i - 1][1][0];
            dp[i][0][0] += dp[i - 1][1][0];
        }
        dp[i][0][0] %= mod;
        dp[i][0][1] %= mod;
        dp[i][1][0] %= mod;
        dp[i][1][1] %= mod;
    }
    cout << (dp[n][0][0] + dp[n][0][1] + dp[n][1][0] + dp[n][1][1]) % mod << endl;
    return 0;
}
還不夠哦
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章