• 墙壁涂色(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
    ",dp[n]);
    35     return 0;
    36 }

    -

  • 相关阅读:
    safenet 超级狗 java调用 小计
    解析Javascript中大括号“{}”的多义性
    openlayers研究(一) 初始化流程
    计算球面两点间距离实现Vincenty+Haversine
    搭建高可用mongodb集群(四)—— 分片
    搭建高可用mongodb集群(三)—— 深入副本集内部机制
    搭建高可用mongodb集群(二)—— 副本集
    C# 7.1 的 Async Main()
    深入理解 C# 7.1 提供的 async 非同步 Main() 方法
    使用Blazor Server 线路处理程序 (circuit handler)跟踪打开的SignalR连接
  • 原文地址:https://www.cnblogs.com/jiamian/p/12201133.html
Copyright © 2020-2023  润新知