递推DP URAL 1081 Binary Lexicographic Sequence

题目传送门

题意:问第k个长度为n的01串是什么(不能有相邻的1)

分析:dp[i][0/1] 表示前i个,当前第i个放1或0的方案数,先预处理计算,dp[i][1]只能有dp[i-1][0]转移过来。k -= dp[n][0] 表示当前放0的方案数不够了,所以必须放1,那么dp[n][0]个方案数都不能用了,相当于k减去这么多。详细解释

代码:

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
using namespace std;

const int MAXN = 1e4 + 10;
const int INF = 0x3f3f3f3f;
int dp[50][2];

void solve(void)
{
    memset (dp, 0, sizeof (dp));
    dp[1][1] = 1;    dp[1][0] = 1;
    for (int i=2; i<44; ++i)
    {
        dp[i][1] = dp[i-1][0];
        dp[i][0] = dp[i-1][1] + dp[i-1][0];
    }
}

int main(void)        //URAL 1081 Binary Lexicographic Sequence
{
    //freopen ("Q.in", "r", stdin);

    solve ();
    int n, k;
    while (scanf ("%d%d", &n, &k) == 2)
    {
        if (k > dp[n][1] + dp[n][0])    {puts ("-1");    continue;}
        while (n)
        {
            if (dp[n][0] >= k)
            {
                printf ("0");
            }
            else    {printf ("1");    k -= dp[n][0];}
            n--;
        }
        puts ("");
    }

    return 0;
}

  

编译人生,运行世界!
原文地址:https://www.cnblogs.com/Running-Time/p/4492497.html