首页 > 代码库 > ural Binary Lexicographic Sequence (dp + dfs)
ural Binary Lexicographic Sequence (dp + dfs)
http://acm.timus.ru/problem.aspx?space=1&num=1081
有一个二进制序列,定义为不能有两个连续的1出现,才是合法的。给出序列的长度n,求合法的二进制序列中按字典序排序后第k个序列是什么。
设dp[i][0]和dp[i][1]分别表示第i位上是0和1的个数。
那么dp[i][0] = dp[i-1][0] + dp[i-1][1];dp[i][1] = dp[i-1][0],打表发现和斐波那契数列相似。
求第k个合法的序列时,因为是按字典序排序,可以发现当 k >= dp[n-1]时这一位取1,否则这一位取0。
#include <stdio.h> #include <iostream> #include <map> #include <set> #include <list> #include <stack> #include <vector> #include <math.h> #include <string.h> #include <queue> #include <string> #include <stdlib.h> #include <algorithm> #define LL __int64 #define eps 1e-12 #define PI acos(-1.0) using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 4010; int dp[50][2],tmp[50]; void init() { memset(dp,0,sizeof(dp)); dp[1][0] = dp[1][1] = 1; tmp[1] = 2; for(int i = 2; i < 44; i++) { dp[i][0] += (dp[i-1][0] + dp[i-1][1]); dp[i][1] += dp[i-1][0]; tmp[i] = dp[i][0] + dp[i][1]; } } void dfs(int n, int k) { if(n == 1) { if(k == 1) printf("0"); else printf("1"); return; } if(k <= tmp[n-1]) { printf("0"); dfs(n-1,k); } else { printf("1"); dfs(n-1,k-tmp[n-1]); } } int main() { init(); int n,k; while(~scanf("%d %d",&n,&k)) { if(k > tmp[n]) { printf("-1\n"); continue; } dfs(n,k); printf("\n"); } return 0; }
ural Binary Lexicographic Sequence (dp + dfs)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。