1. 程式人生 > >NYOJ:01串 【DP入門】

NYOJ:01串 【DP入門】

01串

時間限制:1000 ms  |  記憶體限制:65535 KB  難度:2
描述 

ACM的zyc在研究01串,他知道某一01串的長度,但他想知道不含有“11”子串的這種長度的01串共有多少個,他希望你能幫幫他。

注:01串的長度為2時,有3種:00,01,10。

輸入
第一行有一個整數n(0<n<=100),表示有n組測試資料;
隨後有n行,每行有一個整數m(2<=m<=40),表示01串的長度;
輸出
輸出不含有“11”子串的這種長度的01串共有多少個,佔一行。
樣例輸入
2
2
3
樣例輸出
3
5
本題之前使用遞迴,很明顯會超時! 動態規劃想法:以DP[k]儲存k長度時的組合種數 ∵第k 如果為0,則第k-1可能為1 or 0 所以將 直接將DP[k-1]加入dp[k];   第k 如果為1,則k-1一定為0 則此時 DP[k-2]為此種情況的組合種數; ∴DP[k] = DP[k-1]+DP[k-2];
//
//  main.cpp
//  01串
//
//  Created by JUNJIEGAO on 15/11/7.
//  Copyright © 2015年 JUNJIEGAO. All rights reserved.
//

#include <iostream>
using namespace std;

int ans[41];
void init ()
{
    ans[2] = 3;
    ans[3] = 5;
    for (int i=4;i<=40;i++)
    {
        ans[i] = ans[i-1]+ans[i-2];
    }
}
int main(int argc, const char * argv[]) {

    init();
    int n,len;
    cin>>n;
    while(n--)
    {
        cin>>len;
        cout<<ans[len]<<endl;
    }
    return 0;
}