NYOJ:01串 【DP入門】
阿新 • • 發佈:2018-12-24
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; }