1081. Binary Lexicographic Sequence(dp)

來源:互聯網
上載者:User

題意:給出一個串的長度n,串只有0,1組成,但是不能有兩個相鄰的1。按字典序給串排列,最先肯定是0000,接著是0001,依此類推。給一個數字m,輸出在長度為n的情況下,第m個排列的串是什麼,如果m大於總排列數,輸出-1

思路:

遞推。
首先,計算滿足條件的N位序列的總個數。設為f[n]
f[n]=f[n-1]+f[n-2]
可是這樣理解:長度為N的序列對應於:
1.長度為N-1的序列左邊加上0
2.長度為N-2的序列左邊加上10
之後就類似求排列序號的方法。
要明白以下這個事實:
N位序列 0,a2,...an 必然在 N位序列 1,a2,..an 之前。
而 0,a2,..an 序列數對應於f[n-1]
若K大於f[n-1]則說明第一位為1,問題轉化為求N-1位序列的第 K-f[n-1] 個是什麼
若K小於等於f[n-1]則說明第一位為0,問題轉化為求N-1位序列的第K個是什麼

代碼:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int f[45];void calf(){    f[0]=1;    f[1]=2;    int k=2;    while(k<44)    {        f[k]=f[k-1]+f[k-2];        k++;    }}int main(void){    calf();    int n,k;    while(scanf("%d%d",&n,&k)!=EOF)    {        if(k>f[n])            printf("-1\n");        else        {            while(n)            {                if(k>f[n-1])                {                    putchar('1');                    k-=f[n-1];                }                else                    putchar('0');                n--;            }            putchar('\n');        }    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.