zoukankan      html  css  js  c++  java
  • Adjacent Bit Counts(01组合数)

    Adjacent Bit Counts

    4557 Adjacent Bit Counts
    For a string of n bits x 1 , x 2 , x 3 ,..., x n , the adjacent bit count of the string (AdjBC(x)) is given by
    x 1 ∗ x 2 + x 2 ∗ x 3 + x 3 ∗ x 4 + . . . + x n−1 ∗ x n
    which counts the number of times a 1 bit is adjacent to another 1 bit. For example:
    AdjBC(011101101) = 3
    AdjBC(111101101) = 4
    AdjBC(010101010) = 0
    Write a program which takes as input integers n and k and returns the number of bit strings x of n
    bits (out of 2 n ) that satisfy AdjBC(x) = k. For example, for 5 bit strings, there are 6 ways of getting
    AdjBC(x) = 2:
    11100, 01110, 00111, 10111, 11101, 11011
    Input
    The first line of input contains a single integer P , (1 ≤ P ≤ 1000), which is the number of data sets that
    follow. Each data set is a single line that contains the data set number, followed by a space, followed by
    a decimal integer giving the number (n) of bits in the bit strings, followed by a single space, followed by
    a decimal integer (k) giving the desired adjacent bit count. The number of bits (n) will not be greater
    than 100 and the parameters n and k will be chosen so that the result will fit in a signed 32-bit integer.
    Output
    For each data set there is one line of output. It contains the data set number followed by a single space,
    followed by the number of n-bit strings with adjacent bit count equal to k.
    Sample Input
    10
    1 5 2
    2 20 8
    3 30 17
    4 40 24
    5 50 37
    6 60 52
    7 70 59
    8 80 73
    9 90 84
    10 100 90
    Sample Output
    1 6
    2 63426
    3 1861225
    4 168212501
    5 44874764
    6 160916
    7 22937308
    8 99167
    9 15476
    10 23076518

    题意:给你一个长为n的串,且仅有0和1组成,x 1 ∗ x 2 + x 2 ∗ x 3 + x 3 ∗ x 4 + . . . + x n−1 ∗ x n 这样计算的值等于k,问该字符串有多少种这样的组合?

    分析:用动态规划的思想,假如dp[i][j][k]表示组合数,i表示字串长度,j表示该串价值,k表示最后一个字符只能为1和0。

    dp[i][j][0],有i个字符,价值为j,最后一位为0,这样的组合数等于长度为i-1,价值为j,最后一位为0的组合数加上长度为i-1,价值为j,最后一位为1的组合数,即dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1]。

    dp[i][j][1],有i个字符,价值为j,最后一位为1,这样的组合数等于长度为i-1,价值为j,最后一位为0的组合数加上长度为i-1,价值为j-1,最后一位为1的组合数,即dp[i][j][1]=dp[i-1][j][0]+dp[i-1][j-1][1]。

    总结下来状态转移方程即是:

    dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1]

    dp[i][j][1]=dp[i-1][j][0]+dp[i-1][j-1][1]

    再说说初始化

    长度为1的时候,没有其他的数和它相乘,所以价值只能为0

    dp[1][0][0]=1;长度为1价值为0且最后一位为0的组合数只有1种,比如0

    dp[1][0][1]=1;长度为1价值为0且最后一位为1的组合数只有1种,比如1

    看了别人题解,都说这是很简单的动规,佩服佩服

     1 #include<cstdio>
     2 #include<algorithm>
     3 using namespace std;
     4 int dp[105][105][2];//dp定义为全局变量
     5 void find_(){
     6      dp[1][0][0]=dp[1][0][1]=1;//初始化
     7      for(int i=2;i<105;i++){//每一个长度时,都需要初始化一遍
     8             dp[i][0][0]=dp[i-1][0][1]+dp[i-1][0][0];
     9             dp[i][0][1]=dp[i-1][0][0];
    10         for(int j=1;j<i;j++){//长度为i时,价值最多为i-1
    11             dp[i][j][0]=dp[i-1][j][1]+dp[i-1][j][0];
    12             dp[i][j][1]=dp[i-1][j][0]+dp[i-1][j-1][1];
    13         }
    14      }
    15 }
    16 int main() {
    17     int p;
    18     find_();
    19     scanf("%d",&p);
    20     while(p--) {
    21         int n,a,b;
    22         scanf("%d %d %d",&n,&a,&b);
    23         printf("%d %d
    ",n,dp[a][b][0]+dp[a][b][1]);
    24     }
    25     return 0;
    26 }
    27 
    28 CUTECode
  • 相关阅读:
    使用Delphi调用条形码控件BarTender打印标签
    我看过的书
    语法规则
    智能家居
    HAL库ADC的DMA采集
    HAL库串口中断接收
    触动心灵的一句话
    摄影技巧
    中国茶道
    单片机延时函数
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/9804558.html
Copyright © 2011-2022 走看看