当前位置:   article > 正文

hihocoder 第113周 Fibonacci(动态规划)_斐波拉切是动态规划

斐波拉切是动态规划

题目大意:给定一个数字序列,求该序列的所有子序列中有多少是斐波拉契数列的前缀,即满足"1 1 2 3 ..."的形式。

解题思路:首先注意ai的范围,首先可以肯定斐波拉切数列不会太多,最多25个。那么可以利用动态规划的思想,dp[i][j]表示前i个串当中,以斐波拉切数列中的第j数个结尾的,有多少种。

那么可以很简单的得到状态转移方程:

IF a[i] = fib[j]

dp[i][j] = dp[i-1][j] + dp[i-1][j-1];

ELSE

dp[i][j] = dp[i-1][j]

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn = 1000005;
  6. const int mod = 1e9+7;
  7. int n,a[maxn],dp[maxn][30];
  8. int fib[100005];
  9. void init()
  10. {
  11. fib[1] = fib[2] = 1;
  12. for(int i = 3; i <= 25; i++)
  13. fib[i] = fib[i-1] + fib[i-2];
  14. }
  15. int main()
  16. {
  17. init();
  18. while(scanf("%d",&n)!=EOF)
  19. {
  20. memset(dp,0,sizeof(dp));
  21. for(int i = 1; i <= n; i++)
  22. {
  23. scanf("%d",&a[i]);
  24. if(a[i] == 1)
  25. dp[i][1] = (dp[i-1][1] + 1) % mod;
  26. else dp[i][1] = dp[i-1][1];
  27. }
  28. for(int i = 1; i <= n; i++)
  29. for(int j = 2; j <= 25; j++)
  30. {
  31. if(a[i] == fib[j])
  32. dp[i][j] = (dp[i-1][j] + dp[i-1][j-1]) % mod;
  33. else dp[i][j] = dp[i-1][j];
  34. }
  35. int ans = 0;
  36. for(int i = 1; i <= 25; i++)
  37. ans = (ans + dp[n][i]) % mod;
  38. printf("%d\n",ans);
  39. }
  40. return 0;
  41. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/573403
推荐阅读
相关标签
  

闽ICP备14008679号