Binary Lexicographic Sequence_简单DP

来源:互联网 发布:ipad怎么登陆淘宝卖家 编辑:程序博客网 时间:2024/06/05 11:29

这道题要求给出第 K (0 < K < 109) 个 N (0 < N < 44) 位二进制数,该二进制数不得有相邻的“1”。由于时间限制是 0.5 秒,肯定不能使用蛮力搜索从 1 列举到 K。

我们以 N = 5 来分析看看有没有什么规律。如左图所示,我们发现该二进制数最左边的“1”开始在第几个数之后出现是很规律的,如下所示(左图中红色粗框中的数):

1, 2, 3, 5, 8, 13, ...

也就是说,后项等于前二项之和。这不正是扔掉第一项后的斐波那契 ( Fibonacci ) 数列吗?

#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>#include <algorithm>#include <vector>#include <string>#include <iostream>using namespace std;int f[44];int main(){    #ifdef LOCAL    //freopen("in.txt", "r", stdin);    //freopen("out.txt", "w", stdout);    #endifint N, K;f[0] = 1;f[1] = 2;f[2] = 3;for(int i = 3; i <= 43; i++){        f[i] = f[i - 1] + f[i - 2];}while(scanf("%d%d", &N, &K) != EOF){        if(K > f[N]) printf("-1\n");        else{            while(N>0){                if(K <= f[N - 1]) putchar('0');                else{                    putchar('1');                    K -= f[N - 1];                }                N--;            }            putchar('\n');        }}return 0;}



原创粉丝点击