• 危险的组合


    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88159#problem/M

    题意:

           n个盒子摆放成一排,当有3个以上U摆放在一起的时候,就会有危险,求总共有多少种危险的情况。

    案例:

          Sample Input

          4

          5

          0

          Sample Output

          3

          8

    分析:

           这题思路跟之前发布的不容易事件类似。

          每放置一个新的盒子,都对应2种情况:设dp[n]=当盒子数目为n的情况下,符合要求(出现连续三个U)的放置方法的情况个数。
          1. 前面n-1个盒子已经能符合要求,则第n个盒子无论是U还是L,都满足情况。情况有(2*dp[n-1])种。
          2. 前面n-1个盒子不能符合要求,即只有最后4个满足情况LUUU并且前面并没有连续的三个U的情况才能满足情况。有((1<<(n-4))-dp[n-4])种情况。

          (1<<(n-4))为n-4个盒子放置的总情况数,dp[n-4]为n-4个盒子放置出现危险(有连续三个U出现)的情况数。最后四个盒子仅一种摆法,可忽略。
          状态转移方程:

                            dp[n]=2*dp[n-1]+(1<<(n-4))-dp[n-4]

    源代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 long long dp[100];
     4 int n,ans;
     5 int main()
     6 {
     7     memset(dp,0,sizeof(dp));
     8     dp[3]=1;
     9     dp[4]=3;
    10     for(int i=5;i<=100;i++)//记录排列i个盒子方式
    11     {
    12         dp[i]=2*dp[i-1]+(1<<(i-4))-dp[i-4];
    13     }
    14     while(scanf("%d",&n)&&n)
    15         printf("%lld
    ",dp[n]);
    16     return 0;
    17 }
  • 相关阅读:
    Redis开发与运维:SDS
    Redis开发与运维:数据迁移
    我的2019上半年
    C# 并发编程
    经典排序算法 — C# 版(上)
    图解 -- 树的汇总
    图解--队列、并发队列
    栈到CLR
    我们的数组
    算法复杂度
  • 原文地址:https://www.cnblogs.com/huaszjh/p/4744464.html
Copyright © 2020-2023  润新知