zoukankan      html  css  js  c++  java
  • BNU4286——Adjacent Bit Counts——————【dp】

    Adjacent Bit Counts

    Time Limit: 1000ms
    Memory Limit: 65536KB
    64-bit integer IO format: %lld      Java class name: Main
    Type: 
    None
     
     
    For a string of bits x1x2, x3, …, xn,B 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 and and returns the number of bit strings of bits (out of 2) 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 ≤ ≤ 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 and 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


    解题思路:用dp[i][j][k]来定义状态。i表示当前数字是第i位,j表示达到j值,k代表末尾是0还是1.由于当末尾为0对新加的一位没有要求,即j值不会变动,所以当dp[i][j][0]时转移方程为dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1]。而当末尾为1时如果新加一位的值为1,会影响j的值。所以当dp[i][j][1]时dp[i][j][1]=dp[i-1][j-1][1]+dp[i-1][j][0]。



    #include<bits/stdc++.h>
    using namespace std;
    int dp[500][500][2];
    void DP(int n){
        memset(dp,0,sizeof(dp));
        dp[1][0][0]=1;
        dp[1][0][1]=1;
        for(int i=2;i<n;i++){
            for(int j=0;j<i;j++){
                dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];
                if(j){
                    dp[i][j][1]=dp[i-1][j][0]+dp[i-1][j-1][1];
                }else{
                    dp[i][j][1]=dp[i-1][j][0];
                }
    
            }
        }
    }
    int main(){
        int n;
        scanf("%d",&n);
        DP(110);
        while(n--){
            int t,ta,tb;
            scanf("%d%d%d",&t,&ta,&tb);
            cout<<t<<" "<<dp[ta][tb][0]+dp[ta][tb][1]<<endl;
    
        }
        return 0;
    }
    

      

  • 相关阅读:
    openCV使用
    Object-C知识点 (二) 控件的实用属性
    Linux 配置JDK + MyEclipse
    虚拟机+linux+大杂烩
    THREE.js代码备份——webgl
    THREE.js代码备份——webgl
    THREE.js代码备份——canvas_ascii_effect(以AscII码显示图形)
    THREE.js代码备份——canvas
    THREE.js代码备份——canvas_lines(随机点、画线)
    THREE.js代码备份——线框cube、按键、鼠标控制
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4433933.html
Copyright © 2011-2022 走看看