zoukankan      html  css  js  c++  java
  • 墙壁涂色(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 }

    -

  • 相关阅读:
    ==和equals区别
    如何创建一个不可变类
    mysql用户的创建和授权
    事务
    Java知识点检测
    Redis
    正则表达式中match的用法
    rfind的用法
    找出文件夹里所有的文件路径
    合并多个pdf文件
  • 原文地址:https://www.cnblogs.com/jiamian/p/12201133.html
Copyright © 2011-2022 走看看