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 }











  • 相关阅读:
    Java并发(三):重排序
    Java并发(六):volatile的实现原理
    Java并发(五):synchronized实现原理
    Java并发(一):多线程干货总结
    JDK源码学习笔记——String
    Java并发(二):Java内存模型
    JVM命令-java服务器故障排查
    vue之数据请求方式
    vue之菜单添加选择,知识:数据双向绑定、循环渲染、事件点击以及按键的点击
    Vue【第3章】:Vue常用指令二:事件和方法
  • 原文地址:https://www.cnblogs.com/lr599909928/p/12033499.html
Copyright © 2011-2022 走看看