危险的组合

题目链接: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\n",dp[n]);
16     return 0;
17 }

 

posted @ 2015-08-20 20:09  ~瞬间*  阅读(626)  评论(0编辑  收藏  举报