HDU 2569(简单的递推)

彼岸

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5533    Accepted Submission(s): 3213


Problem Description
突破蝙蝠的包围,yifenfei来到一处悬崖面前,悬崖彼岸就是前进的方向,好在现在的yifenfei已经学过御剑术,可御剑轻松飞过悬崖。
现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为n的线段,线段上的每一单位长度空间都可能飞过红,黄,蓝三种珠子,而yifenfei必定会在该空间上碰到一种颜色的珠子。如果在连续3段单位空间碰到的珠子颜色都不一样,则yifenfei就会坠落。
比如经过长度为3的悬崖,碰到的珠子先后为 “红黄蓝”,或者 “蓝红黄” 等类似情况就会坠落,而如果是 “红黄红” 或者 “红黄黄”等情况则可以安全到达。
现在请问:yifenfei安然抵达彼岸的方法有多少种?
 
 1 //该题递推时;第n项应该分开考虑n-1和n-2是否相同
 2 //(1)如果相同那么n就可以没有顾虑的选择3种中的任意一种,则等价于n-2所有的取值所以a[n-2]*3
 3 //(2)如果不同那么等价于a[n-1]-a[n-2],即全部减去相同的的那么都应该是不同的,这一部分考虑的就是第n必选择一个和前两相等,那么就应该是(a[n-1]-a[n-2])*2
 4 //一直未找到不同的时候的情况,一直未想到用全部情况减去相同的情况就是不同的情况,
 5 //思维有待提高,灵活性不够 
 6 #include<iostream>
 7 #include<cstdio>
 8 using namespace std ;
 9 
10 long long a[43];
11 void create_table()
12 {
13     a[1]=3,a[2]=9;
14     for(int i=3;i<40;i++)
15     {
16         a[i]=a[i-2]*3+(a[i-1]-a[i-2])*2;
17     }
18 }
19 int main ()
20 {
21     create_table();
22     int T; cin>>T;
23     while (T--)
24     {
25         int n; cin>>n;
26         cout<<a[n]<<endl;
27     }
28     return 0;
29 }
 
原文地址:https://www.cnblogs.com/Yokel062/p/10137792.html