这里采用动态规划的思想
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
我们可以在一开始创建一个数组,然后从最开始的条件不断向后推导,从斐波那契数列的规律我们可以得知:
fib[i] = fib[i - 1] + fib[i - 2]
(这里fib
代表斐波那契数列)
得到这样的一个关系(递推方程)就好办了,我们要求解数列第i
个位置上的数,只需要知道i - 1
和i - 2
的值即可,这样,一个大问题,就分成了两个小问题,比如现在我们要求解斐波那契数列的第5个元素:
fib[4] = fib[3] + fib[2]
现在我们只需要知道fib[3]
和fib[2]
即可,那么我们接着来看:fib[3] = fib[2] + fib[1]
以及fib[2] = fib[1] + fib[0]
- 由于
fib[0]
和fib[1]
我们已经明确知道是1
了,那么现在问题其实已经有结果了,把这些小问题的结果组合起来不就能得到原来大问题的结果了吗
#include <stdio.h>
int main(){
int target = 10; //target想要的第几位数
int dp[target];
dp[0] = 1;
dp[1] = 1;
for(int i = 2; i < target; ++i)
dp[i] = dp[i - 1] + dp[i - 2];
printf("%d",dp[target - 1]);
}