LightOJ1105 Fi Binary Number(数位DP)

题目要求第k个没有连续两个1的二进制数。

这算数位DP吧,只不过以前遇到的是统计区间的数字情况,而这题是求第几个数字,差不多是反过来的。

本来我想用状态dp[i][0/1]表示长度i末尾0或1的二进制数个数,发现这样好像没法解。

最后需要根据数位DP状态的值推算出要求二进制数各个位置是0还是1,这个肯定是从高位到低位确定——所以应该反过来表示状态:

dp[i][0/1]:长度i开头为0或1的二进制数个数

最后的求解:

  • 先利用dp[i][1]的值确定出要求二进制的位数
  • 位数知道后,最高位得是1
  • 最后就从高到低根据 前一位是0还是1、dp[i][0]的值和剩下的个数的关系 一位位确定。
 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 #define MAXL 100
 5 int d[MAXL][2];
 6 int main(){
 7     d[0][0]=1;
 8     for(int i=1; i<100; ++i){
 9         d[i][0]=d[i-1][0]+d[i-1][1];
10         d[i][1]=d[i-1][0];
11     }
12     int t,n;
13     scanf("%d",&t);
14     for(int cse=1; cse<=t; ++cse){
15         scanf("%d",&n);
16         int len=1;
17         while(n>d[len][1]){
18             n-=d[len][1];
19             ++len;
20         }
21         printf("Case %d: 1",cse);
22         int last=1;
23         for(int i=1; i<len; ++i){
24             if(last==1){
25                 putchar(‘0‘);
26                 last=0;
27             }else if(n>d[len-i][0]){
28                 n-=d[len-i][0];
29                 putchar(‘1‘);
30                 last=1;
31             }else{
32                 putchar(‘0‘);
33                 last=0;
34             }
35         }
36         putchar(‘\n‘);
37     }
38     return 0;
39 }
时间: 2024-11-07 10:31:35

LightOJ1105 Fi Binary Number(数位DP)的相关文章

Hdu3079Balanced Number数位dp

枚举支点,然后就搞,记录之前的点的力矩和. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <s

SPOJ MYQ10 Mirror Number 数位dp&#39;

题目链接:点击打开链接 MYQ10 - Mirror Number A number is called a Mirror number if on lateral inversion, it gives the same number i.e it looks the same in a mirror. For example 101 is a mirror number while 100 is not. Given two numbers a and b, find the number

多校5 HDU5787 K-wolf Number 数位DP

1 // 多校5 HDU5787 K-wolf Number 数位DP 2 // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d 3 // f 用作标记,当现在枚举的数小于之前的数时,就不用判断i与dig[pos]的大小 4 // 整体来说就,按位往后移动,每次添加后形成的数都小于之前的数,并且相邻k位不一样,一直深搜到cnt位 5 // http://blog.csdn.net/weizhuwyzc000/article/details/5209769

hdu 5898 odd-even number 数位DP

odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 716    Accepted Submission(s): 385 Problem Description For a number,if the length of continuous odd digits is even and the length

hdu 5787 K-wolf Number 数位dp

数位DP 神模板 详解 为了方便自己参看,我把代码复制过来吧 // pos = 当前处理的位置(一般从高位到低位) // pre = 上一个位的数字(更高的那一位) // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回, // 给计数器+1. // limit = 是否受限,也即当前处理这位能否随便取值.如567,当前处理6这位, // 如果前面取的是4,则当前这位可以取0-9.如果前面取的5,那么当前 // 这位就不能随便取,不然会超出这个数的范围,所以如果前面取

codeforces Hill Number 数位dp

http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits:  200000 KB 64-bit interger IO format:  %lld   Java class name:  Main Description A Hill Number is a number whose digits possibly rise and then possibl

fzu 2109 Mountain Number 数位DP

题目链接:http://acm.fzu.edu.cn/problem.php?pid=2109 题意: 如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则这个数为Mountain Number. 给出L, R,求区间[L, R]有多少个Mountain Number. 思路: 数位DP,判断当前是偶数位还是奇数位(从0开始),如果是偶数位,那么它要比前一个数的值小, 如果是奇数位,那么它要比前一个数的值大. 1 #include <iostream>

hdu3709---Balanced Number(数位dp)

Problem Description A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box with weight indicated by the digit. When a pivot is placed at some digit of the nu

HDU 3709 Balanced Number (数位DP)

Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 3798    Accepted Submission(s): 1772 Problem Description A balanced number is a non-negative integer that can be balanced if a pi