zoukankan      html  css  js  c++  java
  • Adjacent Bit Counts(uvalive)

    For a string of n bits x1, x2, x3,…, xn, the adjacent bit count of the string (AdjBC(x)) is given by

                                                x1 ∗ x2 + x2 ∗ x3 + x3 ∗ x4 + . . . + xn−1 ∗ xn

    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
    题解:求一个长度为p,构造一个价值为n的字符串的方法数;

    首先如果我们要构造一个价值为7的字符串,若分为两部分的话,我们有1+6,2+5,3+4等3种方案,对于1+6,我们又可以分为一个子问题,将6分为两部分,以此类推;

    这样就满足一个最优子结构;这样我们把原问题可以分为若干子问题,我们用的dp[i][j]表示长度为i-1,价值为j的字符串的方法数,由于最后一位0与1两种情况,我们可以定义3维数组;

    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 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 typedef long long ll;
     6 const int MAXN=1e3+10;
     7 int m,n;
     8 int dp[MAXN][MAXN][2];
     9 using namespace std;
    10 int  main()
    11 {
    12     cin>>m;
    13     int p,k,u;
    14    while(m--)
    15    {
    16        cin>>p>>k>>u;
    17        memset(dp,0,sizeof(dp));
    18        dp[1][0][1]=1;
    19        dp[1][0][0]=1;
    20        for(int i=2;i<=k;i++)
    21        {
    22            for(int j=0;j<=u;j++)
    23            {
    24                for(int t=0;t<2;t++)
    25                {
    26                    if(t==0)
    27                    {
    28                        dp[i][j][t]=dp[i-1][j][0]+dp[i-1][j][1];
    29                    }
    30                    else
    31                    {
    32                        dp[i][j][t]=dp[i-1][j][0]+dp[i-1][j-1][1];
    33                    }
    34                }
    35            }
    36        }
    37        cout<<p<<" "<<dp[k][u][0]+dp[k][u][1]<<endl;
    38    }
    39 }

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

  • 相关阅读:
    c/cpp枚举练习
    数据类型的标识
    引用变量
    cocos2dx 3.3 笔记
    希望获取到页面中所有的checkbox怎么做?
    如何判断某变量是否为数组数据类型?
    驼峰函数写法
    trim()函数
    js 获取页面可视区域宽高
    全屏滚动插件
  • 原文地址:https://www.cnblogs.com/moomcake/p/9798864.html
Copyright © 2011-2022 走看看