VJ train1 I彼岸

一道递推题(我这个菜鸡刚开始以为是排列组合)

题目:

   突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。
现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei必定会在该空间上碰到一种颜色的珠子。如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。
比如经过长度为3的悬崖,碰到的珠子先后为 “红黄蓝”,或者 “蓝红黄” 等类似情况就会坠落,而如果是 “红黄红” 或者 “红黄黄”等情况则可以安全到达。
现在请问:yifenfei安然抵达彼岸的方法有多少种?

Input

输入数据首先给出一个整数C,表示测试组数。
然后是C组数据,每组包含一个正整数n (n<40)。

Output

对应每组输入数据,请输出一个整数,表示yifenfei安然抵达彼岸的方法数。
每组输出占一行。

Sample Input

2
2
3

Sample Output

9
21

分析:
我们直接从n=3的情况开始
1、假如第1个格子和第2个格子颜色是相同的,那么它们颜色相同的数目和第1个格子的方法数是相同(因为第2个格子的颜色和第1个格子相同)
而此时第3个格子就可以有三种颜色进行选择,我们因此向后进行递推得到:a[n]=a[n-2]*3

2、假如第1个格子和第2个格子颜色不同,因为我们根据1得到它们颜色相同的数目和第1个格子的相同,所以它们不同的数目就可以用第2个格子的方法数减去第1个格子的方法数而得到,
而此时第3个格子可以有两种颜色进行选择,我们因此向后进行递推得到:a[n]=(a[n-1]-a[n-2])*2

综上:a[n]=an[n-2]*3+(a[n-1]+a[n-2])*2 (n>=3)

AC代码:
 1 #include <iostream>
 2 #include <cstring>
 3 #include <math.h>
 4 #include <algorithm>
 5 #include <cstdio>
 6 #include <stack>
 7 #include <queue>
 8 #include <vector>
 9 #define ll long long
10 using namespace std;
11 int t;
12 int a[1000];
13 int n;
14 int main()
15 {
16       cin>>t;
17       a[1]=3,a[2]=9;
18       for(int i=3;i<=40;i++)
19           a[i]=a[i-2]*3+(a[i-1]-a[i-2])*2;
20       while(t--)
21       {
22           cin>>n;
23           cout<<a[n]<<endl;
24 
25       }
26     return 0;
27 }











原文地址:https://www.cnblogs.com/lr599909928/p/12033499.html