hihocoder 第113周 Fibonacci(动态规划)
生活随笔
收集整理的這篇文章主要介紹了
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]
#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int maxn = 1000005; const int mod = 1e9+7; int n,a[maxn],dp[maxn][30]; int fib[100005];void init() {fib[1] = fib[2] = 1;for(int i = 3; i <= 25; i++)fib[i] = fib[i-1] + fib[i-2]; }int main() {init();while(scanf("%d",&n)!=EOF){memset(dp,0,sizeof(dp));for(int i = 1; i <= n; i++){scanf("%d",&a[i]);if(a[i] == 1)dp[i][1] = (dp[i-1][1] + 1) % mod;else dp[i][1] = dp[i-1][1];}for(int i = 1; i <= n; i++)for(int j = 2; j <= 25; j++){if(a[i] == fib[j])dp[i][j] = (dp[i-1][j] + dp[i-1][j-1]) % mod;else dp[i][j] = dp[i-1][j];}int ans = 0;for(int i = 1; i <= 25; i++)ans = (ans + dp[n][i]) % mod;printf("%d\n",ans);}return 0; }
總結
以上是生活随笔為你收集整理的hihocoder 第113周 Fibonacci(动态规划)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nyoj 947 Max Xor(字典树
- 下一篇: 微信第一个“小程序”亮相:不是APP胜似