自分の手で.


質問する



質問リンク:https://www.acmicpc.net/problem/2193

ポリシー

  • このパラメータには、1から2回連続して現れることができないという制限条件があります.
  • 1で始まるので、2番目の数字は0でなければなりません.
  • 図は、
  • 5ビット数10000が100および1000から構成されていることを示している.
  • がオーバーフローする可能性があることを忘れないでください.pinaryNum(n+1) = pinaryNum(n) + pinaryNum(n-1)
  • コード#コード#

    #include<bits/stdc++.h>
    
    using namespace std;
    
    #define mine
    
    int N;
    long long dp[91];
    long long pinaryNumber(int n){
        if(n == 1) return 1;
        if(n == 2) return 1;
        long long& ret = dp[n];
        if(ret != -1) return ret;
        return ret = pinaryNumber(n-1) + pinaryNumber(n-2);
    }
    
    int main(){
        ios_base::sync_with_stdio(false);
        // freopen("../input.txt","rt",stdin);
        
        memset(dp, -1, sizeof(dp));
        cin >> N;
        
        cout << pinaryNumber(N) << endl;
        
    
        return 0;
    }
    
    
    

    感想


    ルールさえ見つければ、問題はやりやすい.高校時代に点火式を解いたのを覚えていて、面白かったです.ただし、発生する可能性のあるオーバーフローを常にチェックし、basecaseを覚えておいてください.