您的位置:首页 > 产品设计 > UI/UE

递推DP URAL 1081 Binary Lexicographic Sequence

2015-05-10 17:02 330 查看
题目传送门

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

分析:dp[i][0/1] 表示前i个,当前第i个放1或0的方案数,先预处理计算,dp[i][1]只能有dp[i-1][0]转移过来。k -= dp
[0] 表示当前放0的方案数不够了,所以必须放1,那么dp
[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
[1] + dp
[0])    {puts ("-1");    continue;}
while (n)
{
if (dp
[0] >= k)
{
printf ("0");
}
else    {printf ("1");    k -= dp
[0];}
n--;
}
puts ("");
}

return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: