突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。
现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei必定会在该空间上碰到一种颜色的珠子。如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。
比如经过长度为3的悬崖,碰到的珠子先后为 “红黄蓝”,或者 “蓝红黄” 等类似情况就会坠落,而如果是 “红黄红” 或者 “红黄黄”等情况则可以安全到达。
现在请问:yifenfei安然抵达彼岸的方法有多少种?Input
输入数据首先给出一个整数C,表示测试组数。
然后是C组数据,每组包含一个正整数n (n<40)。Output
对应每组输入数据,请输出一个整数,表示yifenfei安然抵达彼岸的方法数。
每组输出占一行。Sample Input
2 2 3Sample Output
9 21
题意:安然抵达彼岸的方法数,n是河宽
思路:1 第n项应该分开考虑n-1和n-2是否相同
(1)如果相同那么n就可以没有顾虑的选择3种中的任意一种,则等价于n-2所有的取值所以a[n-2]*3
(2)如果不同那么等价于a[n-1]-a[n-2],即全部减去相同的的那么都应该是不同的,这一部分考虑的就是第n必选择一个和前两相等,那么就应该是(a[n-1]-a[n-2])*2
Code:
#include<stdio.h>
#include<string.h>
#include<algorithm>
typedef long long ll;
const int N=1e5+10;
using namespace std;
int a[50];
void w()
{
a[1]=3,a[2]=9;
for(int i=3; i<=40; i++)
{
a[i]=a[i-2]*3+(a[i-1]-a[i-2])*2;
}
}
/// n-2 n-1 n
///a[i-2]*3 若n-2与n-1相同 第n项 随意三种
///(a[i-1]-a[i-2])*2 若不同 (a[i-1]-a[i-2])是不同的情况
/// 再乘以2(和前面两项任意一个相同)
int main()
{
int c;
w();
scanf("%d",&c);
while(c--)
{
int n;
scanf("%d",&n);
printf("%d\n",a[n]);
}
return 0;
}
虽然以前做过这道题,但是再次看到,竟然不会了.........思维退化了吗???......继续领悟刷题吧~