CSU-ACM暑假集训基础组训练赛(5-1) C - Problem C
来源:互联网 发布:对于人工智能的看法600 编辑:程序博客网 时间:2024/05/03 14:01
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。
- CSU-ACM暑假集训基础组训练赛(5-1) C - Problem C
- CSU-ACM暑假集训基础组训练赛(5-1) B - Problem B
- CSU-ACM暑假集训基础组训练赛(5-1) A - Problem A
- CSU-ACM暑假集训基础组训练赛(1) A - Problem A
- CSU-ACM暑假集训基础组训练赛(1) B - Problem B
- CSU-ACM暑假集训基础组训练赛(2) B - Problem B
- CSU-ACM暑假集训基础组训练赛(2) D - Problem D
- 2013暑假集训B组训练赛第一场
- 2013暑假集训B组训练赛第二场
- CSU-ACM2017暑假集训比赛1 C
- CSU-ACM2017暑假集训比赛1 C
- CSU-ACM2017暑假集训比赛1 C
- CSU-ACM暑假集训基础组七夕专场 D - Problem D
- CSU-ACM暑假集训基础组七夕专场 F - Problem F
- CSU-ACM2016暑假集训训练1-二分搜索-C
- CSU-ACM2017暑假集训比赛2 C
- CSU-ACM2017暑假集训比赛7 C
- CSU-ACM暑假集训训练1(二分 2015/7/21)
- C语言字符输入/输出函数
- 什么是VPN
- 们是一个函数
- JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
- mysql flashback
- CSU-ACM暑假集训基础组训练赛(5-1) C - Problem C
- 小话设计模式一:适配器模式
- HDU 1846 Brave Game
- python 打印数值的二进制形式
- 2014华为机试题2:大数相加
- Shell脚本调试方法 Shell脚本执行的过程
- 网络知识之TCP/UDP篇
- Android条用系统的图库和照相机
- python日志TimedRotatingFileHandler学习