条形码设计

Time Limit: 1000ms                                                    Memory Limit: 65536KB
64-bit integer IO format: %lld      Java class name: Main

校ACM队准备筹划向学校批请一个专用机房。但是为了防止它变成公用机房,FL建议采用刷卡进入的办法,她设计了一种条形码,每人都对应一个。这种大小为2*n的条形码由以下三种元素构成:1*2、2*1、2*2的长方形方格。但是我们同样也知道,很多人都容易在刷卡时把卡的位置搞反。为了避免机器错误的处理,我们认为下图的两种条形码是一样的(图中颜色只是为方便说明,不用考虑)。

FL现在很想知道一个问题,就是用她的这种条形码编码方式,对于一个给定的长度n最多能有多少不同的条形码可供使用?

Input

多组测试数据,每一行一个正整数n(n≤28),以n = 0时作为结束。

Output

最与每一组数据,先输出“Case k:”,其中k代表case数,接下来输出一个数,可用的的条形码数目m(m不超过231.)

Sample Input

1
2
3
4
5
0

Sample Output

Case 1:1
Case 2:3
Case 3:3
Case 4:8
Case 5:12

Hint

注意输出英文字母的大小写也必须正确。

这是前天比赛的一道题,今天终于弄明白了。

如果不考虑题中的限制条件,只考虑有多少种排列方式,则F(n) = F(n-1) + 2 * F(n-2),这里面既包括对称的,又包括不对称的,但是对称的只算了一次。考虑到题中的限制条件,不对称的被算了2次,假设最后的输出结果为ans,则ans * 2 = (对称的方式 + 不对称的方式)* 2。所以只需求出对称的排列方式,然后加上F(n),结果就是ans的2倍,除以2就是最终结果。

那么如何求对称的排列方式有多少种呢?
如果n为奇数,如果对称,则中间一定放一个1*2的,只有这样才能保证对称,则对称方式共有b[n] = F[(n-1)/2];
如果n为偶数,如果中间放两个1*2的竖条,如下图,
则一共有b[n] = F[n/2]种对称方式。     如果中间放2个2*1的或者1个2*2的,如下图,则一共有b[n] = F[(n-2)/2] * 2种对称方式。
所以当n为偶数时,总的对称方式有b[n] = F[n/2] + F((n-2)/2] * 2种。
参考代码:
#include<cstdio>
int main()
{int i, n, cas = 0;int a[30] = {0, 1, 3}, b[30] = {0, 1, 3};for(i = 3; i <= 28; i++){a[i] = a[i-1] + 2 * a[i-2];if(i & 1)b[i] = a[(i-1)/2];elseb[i] = a[i/2] + 2 * a[(i-2)/2];}while(~scanf("%d",&n) && n){printf("Case %d:%d\n",++cas, (a[n]+b[n])/2);}return 0;
}

BNUOJ 4064 条形码设计 (动态规划 + 递推)相关推荐

  1. 矩阵压缩降维动态规划递推【P1719 最大加权矩形】

    矩阵压缩&降维&动态规划&递推[P1719 最大加权矩形] 题目描述 为了更好的备战NOIP2013,电脑组的几个女孩子LYQ,ZSC,ZHQ认为,我们不光需要机房,我们还需要 ...

  2. P1541 乌龟棋 题解(洛谷,动态规划递推)

    题目:P1541 乌龟棋 感谢大神的题解(他的写的特别好) 写一下我对他的代码的理解吧(哎,蒟蒻就这能这样...) 代码: #include<bits/stdc++.h> #define ...

  3. P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)

    题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...

  4. 数塔(hdoj 2084,动态规划递推)

    在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...

  5. 338 比特位计数(动态规划-递推)

    1. 问题描述: 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] ...

  6. 一只小蜜蜂(hdoj 2044,动态规划递推)

    Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input 输入数据的第一 ...

  7. 算法设计 之 递推法

    2019独角兽企业重金招聘Python工程师标准>>> 递推法就是根据已知条件,分析推导出问题中的联系,然后一步一步进行推倒直至得到结果. 根据具体问题我们需要选择是正推还是逆推来解 ...

  8. 折线分割平面(hdoj 2050,动态规划递推)

    Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面 ...

  9. 直线分割平面(动态规划递推)

    在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域. /* 思路: n=1时有两个平面 这时让n=2,多一条直线,这条直线最 ...

最新文章

  1. 数据中心运维里的那些不成文的规定
  2. 攻防世界-REverse-tt3441810(超简单秒懂)
  3. Mac OS X下查看CPU信息
  4. Spring框架教程集合
  5. Web开发秘方(WEB DEVELOPMENT RECIPES)[47.5MB] PDF扫描版
  6. spring mvc处理静态资源
  7. SQL 难点解决:直观分组
  8. python中文版免费下载-PYTHON自然语言处理(中文最新完整版)pdf下载
  9. 使用VS2015编译OpenJDK8
  10. TP框架使用ajax的post请求方式下载文件
  11. 软件设计方案说明书的编写
  12. Linux驱动开发|UART驱动
  13. 丁向荣单片机pdf_单片机原理与应用
  14. 【Word】如何生成左侧的索引目录
  15. android加速度传感器 源码,Android项目源码利用加速度传感器实现计步
  16. 携程PMO | 小罗说敏捷-WIP限制在制品
  17. 好用的翻译插件-一键自动翻译插件软件
  18. 一看就会(废)的最小二乘法推导
  19. @value()注解
  20. a股用计算机模拟走势,A股竟用此走势将空方一网打尽

热门文章

  1. Linux文件创建时间
  2. PostgreSQL在何处处理 sql查询之四
  3. 关于meta的各种用处以及移动端的常见问题
  4. Oracle常用批量操作
  5. enterpriseTECH Dec 10
  6. How research looks?
  7. 如果不知道做什么,那应该做什么呢?
  8. C# 多重overide
  9. 遍历目录下的文件每250M打包一个文件
  10. win10 uwp 打包第三方字体到应用