CSU-ACM暑假集训基础组训练赛(5-1) C - Problem C

来源:互联网 发布:对于人工智能的看法600 编辑:程序博客网 时间:2024/05/03 14:01
C - Problem C
Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu
Submit Status Practice SPOJ GNYR09F

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ⁿ) 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.

Example

Input:101 5 22 20 83 30 174 40 245 50 376 60 527 70 598 80 739 90 8410 100 90 
Output: 1 62 634263 18612254 1682125015 448747646 1609167 229373088 991679 1547610 23076518

dp(i ,j ,k)表示前i个数中,当前累积和为j,末尾数字为k的方案数。

考虑第i个位置的2种情况:

  1.放0:dp(i,j,0) = dp(i-1,j,0) + dp(i-1,j,1)

  2.放1:dp(i,j,1) = dp(i-1,j,0)+dp(i-1,j-1,1)

ac代码:

#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;const int maxn=101;int dp[maxn][maxn][2];int main(){    int t,i,n,k,m,j;    scanf("%d",&t);    while(t--)    {        memset(dp,0,sizeof(dp));        scanf("%d%d%d",&m,&n,&k);        dp[1][0][1]=dp[1][0][0]=1;//注意这里的初始化,需要初始化第一个位置的值        for(i=2;i<=n;i++)        for(j=0;j<=k;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];        }        printf("%d %d\n",m,dp[n][k][0]+dp[n][k][1]);    }    return 0;}

总结:
多写dp。
0 0
原创粉丝点击