Description
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
题解:
给定位数,根据公式求解。
实际为构造一个满足条件的01串。
dp数组除了存储位数,大小,还要考虑最后一位的情况。
老样子,考虑每回这个串末尾的情况:
(1)如果dp[i][j]最后一位为0,则dp[i][j]等于i-1长度值为j的情况的和,即dp[i-1][j][0]+dp[i-1][j][1];
(2)如果dp[i][j]最后一位为1,则dp[i][j]等于i-1长度值为j最后一位为0的情况和i-1长度下值为j-1且最后一位为1的情况的和,即dp[i-1][j][0]+dp[i-1][j-1][1];
代码如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<algorithm>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define swap(a,b) (a=a+b,b=a-b,a=a-b)
#define maxn 320007
#define N 100000000
#define INF 0x3f3f3f3f
#define mod 1000000009
#define e 2.718281828459045
#define eps 1.0e18
#define PI acos(-1)
#define lowbit(x) (x&(-x))
#define read(x) scanf("%d",&x)
#define put(x) printf("%d\n",x)
#define memset(x,y) memset(x,y,sizeof(x))
#define Debug(x) cout<<x<<" "<<endl
#define lson i << 1,l,m
#define rson i << 1 | 1,m + 1,r
#define ll long long
#define fori(n) for(int i=0;i<n;i++)
//std::ios::sync_with_stdio(false);
//cin.tie(NULL);
using namespace std;
int dp[111][111][2];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(dp,0);
int k,n,cnt,sum=0;
cin>>cnt>>n>>k;
dp[1][0][1]=1;
dp[1][0][0]=1;
for(int i=2;i<=n;i++)
for(int j=0;j<=k;j++)
for(int p=0;p<2;p++)
{
if(p==0)
dp[i][j][p]=dp[i-1][j][0]+dp[i-1][j][1];
else
dp[i][j][p]=dp[i-1][j][0]+dp[i-1][j-1][1];
}
//cout<<dp[3][2][1]<<endl;
cout<<cnt<<" "<<dp[n][k][0]+dp[n][k][1]<<endl;
}
return 0;
}