题目链接:1225. Flags
题意:给你三种颜色的旗帜要求
- 蓝色只能放在红色和白色中间
- 相同颜色不能相邻
给你n个位置问你不同放法的方案数
思路:
- 对于第i个位置来说,如果我们不用蓝色旗帜,那么自然就是i-1这个状态的方案数
因为i-1这个状态的结束只能是红色或白色,我们对应着放就可以了 - 如果我们用蓝色旗帜(当然最后一个位置不可能是蓝色,所以,当前位置用蓝色的意思是放在倒数第二个位置,那么就是i-2这个位置的方案数了)
因此状态转移方程为
dp[i] = dp[i-1] + dp[i-2]
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll dp[110];
void init()
{
dp[1] = 2;
dp[2] = 2;
for(int i = 3; i <= 45; i++)
{
dp[i] = dp[i-1]+dp[i-2];
}
}
int main()
{
init();
cin >> n;
cout << dp[n] << endl;
return 0;
}