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;

}

梦里不知身是客,一晌贪欢。
原文地址:https://www.cnblogs.com/dccmmtop/p/5523791.html