UVa 580 (递推) Critical Mass

题意:

有两种盒子分别装有铀(U)和铅(L),现在把n个盒子排成一列(两种盒子均足够多),而且要求至少有3个铀放在一起,问有多少种排放方法。

分析:

n个盒子排成一列,共有2n中方案,设其中符合要求的为f(n)种。

f(n)可由下面两种情况递推出来:

  • 前n-1个盒子的摆放满足要求,则第n个盒子可以摆放U也可以摆放L,共有2×f(n-1)中方案
  • 前n-1个盒子不满足要求,要使前n个盒子满足要求,则第n-2、n-1、n个盒子一定是U。又因为前面的假设,所以第n-3个盒子一定是L(否则前n-1个盒子满足要求了)。所以我们确定最后四个盒子为LUUU,前面n-4个盒子只要不含有连续三个U即可。共有2n-4-f(n-4)中方案

综上,f(n) = 2×f(n-1) + 2n-4-f(n-4)

 1 #include <cstdio>
 2 typedef long long LL;
 3
 4 LL f[35];
 5
 6 int main()
 7 {
 8     int n;
 9     f[3] = 1, f[4] = 3;
10     for(int i = 5; i <= 30; ++i) f[i] = 2*f[i-1] - f[i-4] + (1 << (i-4));
11     while(scanf("%d", &n) == 1 && n)
12         printf("%lld\n", f[n]);
13
14     return 0;
15 }

代码君

时间: 2024-08-02 02:03:41

UVa 580 (递推) Critical Mass的相关文章

UVa 1645 (递推) Count

题意: 有多少个n个节点的有根树,满足每层节点的子节点个数相同,输出该数目除以1e9+7的余数. 分析: 这种题目就属于那种,看起来很高冷,读完题更高冷.想了N久想不出来,一搜题解,卧槽,这么sb的题我都不会. 言归正传,根据题意,这棵树是关于根节点对称的,对称性非常好,根节点下面的子树也完全相同. 所以就有了如下递推关系: 1 #include <cstdio> 2 #include <cmath> 3 4 const int maxn = 1000; 5 const int M

UVa 1647 (递推) Computer Transformation

题意: 有一个01串,每一步都会将所有的0变为10,将所有的1变为01,串最开始为1. 求第n步之后,00的个数 分析: 刚开始想的时候还是比较乱的,我还纠结了一下000中算是有1个00还是2个00 最终想明白后,并不会出现这样的子串. 总结了几个要点: 第n步之后,串的长度为2n,且0和1的个数相等,分别为2n-1 1经过两步变化为1001,所以每个1经过两步变化就会得到一个00,而且这个00分别被左右两边一个1包围着,不会与其他数字凑出额外的00 0经过两步变化为0110,所以00就会变成0

UVa 1646 (递推 JAVA大数) Edge Case

题意: 有n个点围成一圈,这n个点的匹配就是没有公共点的边集(这些边只能连接一圈中相邻的两点),求所有匹配的个数. 额,我不会分析..=_=|| 算了几个数,找找规律发现它满足斐波那契数列的递推关系,f(n) = f(n-1) + f(n-2) 自从会用了Java的BigInteger,就懒得写C的高精度了. 1 import java.io.*; 2 import java.util.*; 3 import java.math.*; 4 5 public class Main 6 { 7 st

UVa 1638 (递推) Pole Arrangement

很遗憾,这么好的一道题,自己没想出来,也许太心急了吧. 题意: 有长度为1.2.3...n的n个杆子排成一行.问从左到右看能看到l个杆子,从右往左看能看到r个杆子,有多少种排列方法. 分析: 设状态d(i, j, k)表示i(i≥2)个长度各不相同的杆子,从左往右看能看到j个杆子,从右往左看能看到k个杆子的排列方法.现在假设除了最短的那个杆子,其他i-1个杆子的位置都已排好.那么考虑最短的杆子的位置,有三种决策: 将最短的放到最左边,这样左视图中看到的杆子数加一,右视图不变. 将最短的放到最右边

UVA 11000- Bee 递推

In Africa there is a very special species of bee. Every year, the female bees of such species give birthto one male bee, while the male bees give birth to one male bee and one female bee, and then they die!Now scientists have accidentally found one “

UVA 580 - Critical Mass(DP)

题目链接:580 - Critical Mass 题意:一个栈,里面可以放L和U,有三个连续的U就是不安全的,问共有几种不安全的情况 思路:dp,dp[i][j][k],表示放到第i个,最后两个状态为j,k表示有没有出现不安全.然后去记忆化搜索一下就可以了 然后还有一种做法是,先考虑安全的情况,在用总情况(1<<n 种)减去安全的情况,安全的情况的递推方式很容易dp[i]表示放第i个, dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]. 不过这题都没给数据范围

uva 580 - Critical Mass(dp)

题目链接:uva 580 - Critical Mass 题目大意:给定一个栈,向栈里连续添加n次,每次可以添加U或者L,如果出现连续三个U则为不安全,问有多少种不安全的可能. 解题思路:先求出安全的,用总数减去安全的即为答案. dp[i][j]表示以第i个位置结尾时,有末尾有j个连续的U. 还有一种解法,dp[i]表示第i个位置以L结尾的总数,dp[i] = dp[i-1] + dp[i-2] + dp[i-3]; 解法一: #include <cstdio> #include <cs

uva 1478 - Delta Wave(递推+大数+卡特兰数+组合数学)

题目链接:uva 1478 - Delta Wave 题目大意:对于每个位置来说,可以向上,水平,向下,坐标不能位负,每次上下移动最多为1, 给定n问说有多少种不同的图.结果对10100取模. 解题思路:因为最后都要落回y=0的位置,所以上升的次数和下降的次数是相同的,并且上升下降的关系满足出栈入栈的关系.即卡特兰数. 所以每次枚举i,表示有i个上升,i个下降,用组合数学枚举出位置,然后累加求和. C(2?in)?f(i)=C(2?i?2n)?f(i?1)?(n?2?i+1)?(n?2?i+2)

【UVA】12034-Race(递推,组合数打表)

递推公式,假设第一名有i个人并列,那么: f[n] = C(n,i) * f[n - i]; 打出1 ~ 1000的所有组合数,之后记忆化搜索,需要打表. 14026995 12034 Race Accepted C++ 0.032 2014-08-12 11:47:47 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector&g