概要:合法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啊