• Adjacent Bit Counts(动态规划 三维的)


    /**
    题意:
    给出一个01串 按照题目要求可以求出Fun(X)的值
    比如: 111 Fun(111)的值是2;
    输入:
    t (t组测试数据)
    n k (有n位01串 Fun()的值为K)

    输出:有多少种组合 使得这n位01串的Fun()值为k;

    分析:
    动态规划
    转移方程 dp[i][j][k] i代表01串的长度 j代表Fun()的值(或者说是权重) k代表最后一位是0还是1
    在已知的01串后面加一个0 添加前后的权值不会发生变化 即dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];
    在已知的01串后面加一个1 如果没有添加之前的最后一位是1的话 添加之后的权值是j 那么添加之前的值是j-1
    如果没有添加之前的最后一位是0的话 添加之后的权值是j 那么添加之前的值仍是j

    动态转移方程:
    
            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];
    
    
    初始化很重要
    

    */

    include<stdio.h>

    include<string.h>

    include

    using namespace std;
    int dp[105][105][2];
    int main()
    {
    dp[1][0][0]=1;
    dp[1][0][1]=1;
    for(int i=2; i<=105; i++)
    {
    dp[i][0][0]=dp[i-1][0][0]+dp[i-1][0][1];
    dp[i][0][1]=dp[i-1][0][0];
    }
    for(int i=2; i<=105; i++)
    for(int j=1; j<i; j++)
    {
    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];
    }
    int t;
    scanf("%d",&t);

    while(t--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        printf("%d
    ",dp[n][k][1]+dp[n][k][0]);
    }
    
    return 0;
    

    }

    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    Yii框架中ActiveRecord使用Relations
    MySQL外键约束On Delete、On Update各取值的含义
    30种mysql优化sql语句查询的方法
    PHP数组常用函数
    yii CListView中使用CArrayDataProvider自定义数组作为数据
    java日常统计
    软件工程概论———登录界面的设计
    Java课堂疑问解答与思考5
    Java课堂疑问解答与思考4
    字符串加密
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/5523791.html
Copyright © 2020-2023  润新知