题目:
思路:
1、其实如果这道题数据比较小可以直接递归就可以解决。
2、但是这道题数据比较大,所以需要优化递归
记忆化递归!!!
代码样例:
#include<bits/stdc++.h>
using namespace std;
int a[10000000];
int func(int n){
if(a[n] != 0) return a[n];
if(n <= 2) return n;
return a[n] = (2*func(n-1)+func(n-2))%32767;
}
int main(){
int n;
cin >> n;
while(n--){
int a; cin >> a;
cout << func(a) << endl;
}
return 0;
}
原来记忆化递归多是一件美事呀!!!
思路二:
还有一种方法不用记忆化递归也能过,就是循环,我要求的就是从a0,a1开始,到n结束,也就分别是n-2和n-1;
代码样例:
#include <iostream> // 引入C++标准库中的输入输出流头文件
using namespace std; // 使用C++标准命名空间
// 定义一个名为pell的函数,该函数接受一个整数k作为参数
int pell(int k) {
long long a = 0, b = 1; // 定义并初始化两个长整型变量a和b,分别赋值为0和1
for (int i = 2; i <= k; i++) { // 一个for循环,从2开始到k
long long t = b; // 定义一个临时变量t并初始化为b的值
b = (2 * b + a) % 32767; // 计算下一个Pell数,并取模32767
a = t; // 将临时变量t的值赋给a,以便在下一次循环中使用
}
return b % 32767; // 返回计算出的第k个Pell数模32767的结果
}
int main() { // 主函数的开始
int n; // 定义并初始化一个整数n
cin >> n; // 从标准输入读取一个整数n
while (n--) { // 一个while循环,循环次数由n决定
int a; // 定义并初始化一个整数a
cin >> a; // 从标准输入读取一个整数a
cout << pell(a) << endl; // 调用pell函数计算第a个Pell数的模32767的值,并输出结果
}
return 0; // 主函数返回0,表示程序正常结束
}
a,b为了凑齐规律,为a0=0,b=a1=1。(a初始化的时候没有任何实际题意)