1081. Binary Lexicographic Sequence 动态规划

概要:合法01串中字典序第K大

题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1081

题意:

一个长度为n的,只含01的串。定义一个串为合法串,就是说串中不出现相邻1。问合法串中字典序第K大的是什么。

解析:

我们考虑到这样一个性质:

比如说我们有长度为3的一个串,那么我们怎样构造一个长度为4的串,我们可以在前面添加0或者说1,那么我们是不是只需要考虑最高位就行了。

dp[i][1]:表示长度为i的最高位为1的串的个数。dp[i][0]:表示长度为i的最高位为0的个数,那么:

dp[i+1][1]=dp[i][0];

dp[i+1][0]=do[i][1]+dp[i][0];

dp[1][0]=d[1][1]=1;

我们现在就可以知道长度为n的合法字符串的个数了。然后再利用数位dp的思想,对每一位是打印1还是0进行讨论。

可以这样说,只要K确定,那么每位数是0还是1就已经钦定了。(废话)

for(int i=N;i>=1;--i)

if(dp[i][0]>=K)打印0

else  打印1, K-=dp[i][0]

 

感觉这种想法有点cooool啊

posted on 2017-12-22 11:14  Na_OH  阅读(117)  评论(0编辑  收藏  举报

导航