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安然抵达彼岸的方法有多少种?
现在的问题是:悬崖中间飞着很多红,黄,蓝三种颜色的珠子,假设我们把悬崖看成一条长度为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 }