1225. Flags

Time limit: 1.0 second
Memory limit: 64 MB
On the Day of the Flag of Russia a shop-owner decided to decorate the show-window of his shop with textile stripes of white, blue and red colors. He wants to satisfy the following conditions:
  1. Stripes of the same color cannot be placed next to each other.
  2. A blue stripe must always be placed between a white and a red or between a red and a white one.
Determine the number of the ways to fulfill his wish.
Example. For N = 3 result is following:

Input

N, the number of the stripes, 1 ≤ N ≤ 45.

Output

M, the number of the ways to decorate the shop-window.

Sample

input output
3
4
Problem Source: 2002-2003 ACM Central Region of Russia Quarterfinal Programming Contest, Rybinsk, October 2002
 
 
        最近被问到了这个问题,其实是一个很简单的DP,但就有人纠结为什么就变成了斐波那契。
        首先说下DP的思路:有三种状态,白、蓝、红,直接对应到0、1、2吧,于是可以定义一个数组dp[46][3],因为蓝的只能在白和红之间,所以只有一格的时候初始状态为:dp[1][0]=dp[1][2]=1,dp[1][1]=0。
        对于接下来的每格,这一格是红色依赖于前一格不是红色,这一格是白色依赖于前一格不是白色;另外假设如果前一格是蓝色,那么这一格是红/白色就依赖于前面第二格不是红/白色,于是有下面的递推:
                白色:dp[i][0]=dp[i-1][2]+dp[i-2][2];
                蓝色:dp[i][1]=dp[i-1][0]+dp[i-1][2];
                红色:dp[i][2]=dp[i-1][0]+dp[i-2][0];
        最后把dp[N][0]和dp[N][2]加起来就是所有情况的总和了,因为最后一格无论如何也不可能是蓝色的。
 
 int main2() {
int N;long long dp[][]={};
dp[][]=dp[][]=;
scanf("%d", &N);
for(int i=; i<=N; i++)
dp[i][]=dp[i-][]+dp[i-][],
dp[i][]=dp[i-][]+dp[i-][],
dp[i][]=dp[i-][]+dp[i-][];
printf("%lld\n",dp[N][]+dp[N][]);
return ;
}
        然后我们可以发现一些有趣的事情,其实白色和红色的递推是相互依赖的,而蓝色根本不会有什么用,因为这一格是蓝色取决于前一格不是蓝色,即前一格是白色或红色的情况总和,这个数量并不能为下一格提供对前两格的有效判断。
        仔细观察发现,原来白色和红色就是两个相同的斐波那契数列,这样就好办了,两个合成一个,f[1]=f[2]=2,f[i]=f[i-1]+f[i-2],最后f[N]就是N格的情况总和。
 
 int main() {
int N;long long dp[]={,,};
scanf("%d", &N);
for(int i=; i<=N; i++)
dp[i]=dp[i-]+dp[i-];
printf("%lld\n",dp[N]);
return ;
}
        最后,一眼看出是斐波那契是如何做到的呢?首先无视蓝色,第一个格子f[1]=2,只有白/红两种情况,因为白/红不能连续出现,所以这一格是什么,已经定死了下一格是什么,于是第i个格子f[i]=f[i-1]。然后看看加入蓝色会发生什么:如果前一格是蓝色,那么当前格子一定是和前两格不同的颜色,则f[i]=f[i-2];综合考虑下,f[i]=f[i-1]+f[i-2]。
 
 
 
 
 
 

Ural 1225. Flags 斐波那契DP的更多相关文章

  1. 【斐波那契DP】HDU 4639——HeHe

    题目:点击打开链接 多校练习赛4的简单题,但是比赛的时候想到了推导公式f(n)=f(n-1)+f(n-2)(就是斐波那契数列),最后却没做出来. 首先手写一下he(不是hehe)连续时的规律.0-1 ...

  2. 一只小蜜蜂(斐波那契dp)

    有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示. Input输入数据的第一行是一个整数N,表示测试实例的个数,然后是 ...

  3. 递推DP URAL 1225 Flags

    题目传送门 /* 1 r; 2 b; 3 w 2不能在最前面,所以dp[1] = 2; dp[2] = 2: 13 or 31 dp[i] = dp[i-1] + dp[i-2]; 只加1或3时,总数 ...

  4. CodeAction_beta02 斐波那契 (多维DP)

    题面: solution: 这题和斐波那契数列没有任何关系!!!!! 这题就是一个无脑DP!!!!!!!!!! 因为所有数都要出现至少一次,所以只需考虑其组合而不用考虑其排列,最后乘个 n!就是了(意 ...

  5. [ZJOI2011]细胞——斐波那契数列+矩阵加速+dp

    Description bzoj2323 Solution 题目看起来非常复杂. 本质不同的细胞这个条件显然太啰嗦, 是否有些可以挖掘的性质? 1.发现,只要第一次分裂不同,那么互相之间一定是不同的( ...

  6. DP思想在斐波那契数列递归求解中的应用

    斐波那契数列:1, 1, 2, 3, 5, 8, 13,...,即 f(n) = f(n-1) + f(n-2). 求第n个数的值. 方法一:迭代 public static int iterativ ...

  7. Xorequ(BZOJ3329+数位DP+斐波那契数列)

    题目链接 传送门 思路 由\(a\bigoplus b=c\rightarrow a=c\bigoplus b\)得原式可化为\(x\bigoplus 2x=3x\). 又异或是不进位加法,且\(2x ...

  8. 斐波那契数列 矩阵乘法优化DP

    斐波那契数列 矩阵乘法优化DP 求\(f(n) \%1000000007​\),\(n\le 10^{18}​\) 矩阵乘法:\(i\times k\)的矩阵\(A\)乘\(k\times j\)的矩 ...

  9. HDU 2041 超级楼梯 (斐波那契数列 & 简单DP)

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2041 题目分析:题目是真的水,不难发现规律涉及斐波那契数列,就直接上代码吧. 代码如下: #inclu ...

随机推荐

  1. [C#] 走进异步编程的世界 - 剖析异步方法(下)

    走进异步编程的世界 - 剖析异步方法(下) 序 感谢大家的支持,这是昨天发布<走进异步编程的世界 - 剖析异步方法(上)>的补充篇. 目录 异常处理 在调用方法中同步等待任务 在异步方法中 ...

  2. 在C#里面给PPT添加注释

    平常开会或者做总结报告的时候我们通常都会用到PowerPoint演示文稿,我们可以在单个幻灯片或者全部幻灯片里面添加注释,这样观众可以从注释内容里面获取更多的相关信息. 有些朋友不清楚如何在幻灯片里面 ...

  3. SQLServer学习笔记系列1

    一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数 ...

  4. jQuery2.x源码解析(设计篇)

    jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) 这一篇笔者主要以设计的角度探索jQuery的源代 ...

  5. 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片

    概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...

  6. 用Crontab打造简易工作流引擎

    1. 引言 众所周知,Oozie(1, 2)是基于时间条件与数据生成来做工作流调度的,但是Oozie的数据触发条件只支持HDFS路径,故而面临着这样的问题: 无法判断Hive partition是否已 ...

  7. [php]laravel框架容器管理的一些要点

    本文面向php语言的laravel框架的用户,介绍一些laravel框架里面容器管理方面的使用要点.文章很长,但是内容应该很有用,希望有需要的朋友能看到.php经验有限,不到位的地方,欢迎帮忙指正. ...

  8. 网站美化常见CSS

    伴随网络时代日新月异的发展,用户不仅仅满足于软件系统的功能需求,对软件系统的页面显示效果以及交互模式的要求也逐渐提高.尤其是展示性质的平台页面对于界面美化效果要求更高,有一句话说的好:Html是结构, ...

  9. 细谈Slick(6)- Projection:ProvenShape,强类型的Query结果类型

    在Slick官方文档中描述:连接后台数据库后,需要通过定义Projection,即def * 来进行具体库表列column的选择和排序.通过Projection我们可以选择库表中部分列.也可以增加一些 ...

  10. 从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念

    转(http://www.codeceo.com/article/java-string-ansi-unicode-bmp-utf.html#0-tsina-1-10971-397232819ff9a ...