zoukankan      html  css  js  c++  java
  • 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 }











  • 相关阅读:
    AC自动机学习笔记(模板)
    codeforces1328E
    Codeforces 1288E- Messenger Simulator (树状数组)
    线性基小记
    HDU3949
    矩阵快速幂小记
    5E
    5D
    5C
    5B
  • 原文地址:https://www.cnblogs.com/lr599909928/p/12033499.html
Copyright © 2011-2022 走看看