其他分享
首页 > 其他分享> > 墙壁涂色(DP)

墙壁涂色(DP)

作者:互联网

 

蒜头君觉得白色的墙面好单调,他决定给房间的墙面涂上颜色。

他买了 3 种颜料分别是红、黄、蓝,然后把房间的墙壁竖直地划分成 n 个部分,蒜头希望每个相邻的部分颜色不能相同。

他想知道一共有多少种给房间上色的方案。

例如,当 n = 5 时,下面就是一种合法方案。

由于墙壁是一个环形,所以下面这个方案就是不合法的。

输入格式

一个整数 n,表示房间被划分成多少部分。(1 <=n<=50)

输出格式

一个整数,表示给墙壁涂色的合法方案数。

样例输入

4

样例输出

18

 

解题思路

设dp[i]为长度为i的方案数,然后找出 dp[n] 与 dp[n - 1] 和 dp[n - 2] 的关系。

考虑第 1 块和 n-1块颜色不一样的情况,现在第 n 块要和第 n-1和 1 都不一样,但是只有 3 种颜色,所以 n 只有一种颜色选择,这种情况方案数正好是 dp[n-1]。

考虑第 1 块和 n-1 块颜色一样的情况,第 n-2 块必然要和第 n-1 块不同,同时也就和第 1 块不同,前面 n-2 块方案数是 dp[n-2],第 n 块要和第 1 块和第 n-1块不同,有 2 种选择,所以这种情况方案数是 2∗dp[n−2]。
上面 2 种情况加起来就是总方案数。


 

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <stack>
 9 #include <queue>
10 #include <set>
11 #include <map>
12 #include <sstream>
13 #include <ctime>
14 const int INF=0x3f3f3f3f;
15 typedef long long LL;
16 const int mod=1e9+7;
17 const double PI = acos(-1);
18 const double eps =1e-8;
19 #define Bug cout<<"---------------------"<<endl
20 const int maxn=1e5+10;
21 using namespace std;
22 
23 LL dp[55];//注意开long long 
24 
25 int main()
26 {
27     int n;
28     scanf("%d",&n);
29     dp[1]=3; dp[2]=6; dp[3]=6;
30     for(int i=4;i<=n;i++)
31     {
32         dp[i]=dp[i-1]+2*dp[i-2];
33     }
34     printf("%lld\n",dp[n]);
35     return 0;
36 }

 

 

 

-

标签:方案,const,墙壁,DP,涂色,颜色,include,dp
来源: https://www.cnblogs.com/jiamian/p/12201133.html