URAL 1081 Binary Lexicographic Sequence

URAL 1081

思路

状态:dp[i]表示长度为i的方案数

初始状态:dp[0]=1,dp[1]=2

状态转移:dp[i]=dp[i-1]+dp[i-2],在长度为i-1的串的前面加0,在长度为i-2的串前面加10

对于第i位如果k大于dp[i-1],那么说明这一位时1(k减去dp[i-1]),不然这一位就是0,因为如果这一位是0,那么k最大只能为dp[i-1]

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))

int dp[55];
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,k;
    cin>>n>>k;
    dp[0]=1;
    dp[1]=2;
    for(int i=2;i<=n;i++){
        dp[i]=dp[i-1]+dp[i-2];
    }
    if(k>dp[n]){
        cout<<-1<<endl;
        return 0;
    }
    while(n){
        if(k>dp[n-1]){
            k-=dp[n-1];
            cout<<1;
        }
        else {
            cout<<0;
        }
        n--;
    }
    cout<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/widsom/p/8377070.html