2657 二進制數字
題目大意:長度爲的串,問總共有多少串滿足不含三個連續的或,,輸出答案取餘
方法一:找規律,可以發現
方法二:由於每個位置的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;
}