1. 程式人生 > >Adjacent Bit Counts(UVALive 4557,三維dp)

Adjacent Bit Counts(UVALive 4557,三維dp)

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;
}