题目链接: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 }