友谊长存(递推)

来源:互联网 发布:面试算法题 编辑:程序博客网 时间:2024/04/30 00:25

友谊长存

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 180            测试通过 : 74 

描述

  YCC XHB ZXY在长期的革命生活中建立了深厚的友谊,于是ZXY找来一个金属条,打算刻下一段字符,长度为n,来纪念这一段激情燃烧的岁月。
  这段字符只会包含三种字符:分别是三个人姓名拼音的首字母:X Y Z,但是ZXY觉得XX会让人有邪恶的联想,所以禁止有连续的X出现的出现。
现在ZXY想知道一共有几种不同的刻法,你能帮助他吗?

输入

第一行为数字T;
在接下来的T行中,每行都有一个整形数字n,代表字符串的长度。 (0 < n < 21)

输出

对于每个n,输出长度为n的字符串共有多少种符合情况的组合方式

样例输入

2
1
3

样例输出

3
22



题目分析:

设f[i]表示长度为 i 的的字符串的的组合方式的个数,题目就是要求长度为 n 的字符串的组合方式个数 f[n],由题可知,第 n 位字符只有三种可能 X,Y,Z。

 1. 当第 n 位字符是 X 时,对于 n-1 位只能是Y,Z两种情况,而对于 n-2 位则没有限制。

 2. 当第 n 位字符是 Y,Z 时,对于 n-1 位没有限制。

所以:f[n] = 2*f[n-1] + 2*f[n-2]; 就是所求的递推公式。



代码如下:



#include <stdio.h>int main (){int f[22];f[1]=3,f[2]=8;for (int i=3;i<=21;i++)f[i] = 2*(f[i-1]+f[i-2]);int t,a;scanf ("%d",&t);while (t--){scanf ("%d",&a);printf ("%d\n",f[a]);}return 0;}




0 0
原创粉丝点击