zoukankan      html  css  js  c++  java
  • 递推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;
    }
    

      

    编译人生,运行世界!
  • 相关阅读:
    认识dojo
    CommonJS规范
    点滴
    快速排序
    npm常用命令
    http详解
    js经验点滴js apply/call/caller/callee/bind使用方法与区别分析
    给string添加新的函数
    大马隐藏锁定研究
    一键购买
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4492497.html
Copyright © 2011-2022 走看看