一,看题目
1,这个虽然我不想说,但是我确实不会,但是我的意思是你可以不会但是不能每次都不会那咋办?
二,看题解
1,你得大概知道这个东西是考啥的(虽然这个东西提前给你说了是d递归),但是考试肯定没人给你提示,你得看出来,其实递归题还是挺好看出来的。
2,如果看出来是递归题目,那么就我所了解的,一般核心都是斐波那契数列,你看这题说实话就和斐波那契很像,就是改了一点来考你罢了。
3,比较重要的是推公式,初始推断很重要,一开始第一年的话我也觉得是有两头母牛,但是就全错了。一定要从样例中看看数据。
4,反正最后的公式是f[n]=f[n-1]+f[n-3];
三,写题。
本以为可以一发入魂,但我还是t太naive。
竟然内存超过限制。。我真是。。
于是。。搜索内存超过限制势必记忆化搜索啊!
于是在此复习下记忆化
其实记忆化关键是最后一步
1 #include<iostream> 2 using namespace std; 3 int m[57]; 4 int f(int x) 5 { 6 if(m[x]) return m[x]; 7 if(x==1) return m[1]=1; 8 if(x==2) return m[2]=2; 9 if(x==3) return m[3]=3; 10 if(x==4) return m[4]=4; 11 if(x>=5&&x<=56) m[x]=f(x-1)+f(x-3);//这里是记忆化的关键 12 13 return m[x];and 这里 14 15 } 16 int main(){ 17 18 int x; 19 20 while(cin>>x&&x!=0)//这里也有关键,之前我写成了if(cin>>x&&x!=0),但是这样的话你其实只能处理上一个数据的.. 21 { 22 int ans=f(x); 23 cout<<ans<<endl; 24 25 } 26 return 0; 27 }
1,写题中第一个是记忆化的使用。
2,第二个是这种测试数据个数没说的需要用while循环的。
贴下代码