Pseudo Pseudo Random Numbers
题目描述
It turns out that if numbers were truly random, then each possible bit string (string of 0’s and 1’s) of length n would be equally likely. For example, 111111 would be just as likely as 010110 to occur. Unfortunately, most people believe that any time they see the same bit over and over again, that the process can't be truly random.
You are in charge of generating random bit strings of length n for use in a video game. However, the producer of the game has asked you to remove all possibilities where there are more than k 0’s or 1’s in a row. For example, if n = 4 and k = 2, then the 10 valid bit strings would be 0010, 0011, 0100, 0101, 0110, 1001, 1010, 1011, 1100, and 1101 (the other 6 strings of 4 bits either have more than two 0’s in a row or more than two 1’s in a row, so they are not valid).
Given the values of n and k, determine the number of n bit strings that do not contain any runs of 0’s or 1’s of length greater than k.输入
There is only one input line; it contains two integers: n (2 ≤ n ≤ 20), indicating the length of the bit string for the problem, and k (1 ≤ k ≤ n), indicating the maximal length of a run of 0’s or 1’s for the bit strings to be created.
输出
Print the number of valid bit strings of length n that do not contain any runs of the same bit of length greater than k.
样例输入
【样例1】
4 2
【样例2】
5 1
【样例3】
20 20样例输出
【样例1】
10
【样例2】
2
【样例3】
1048576
思路:数据都很小,直接暴力,生成所有的情况再进行检查,重点学会怎么生成所有的情况(递归)
AC代码
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
vector<string>a;
int n,k;
//生成所有可能的串
void fun(int n,string s)
{if (s.size()==n){a.push_back(s);return ;}fun(n,s+'0');fun(n,s+'1');
}
bool check(string s)
{int cnt=1;for (int i=1;i<s.size();i++){if (s[i]==s[i-1]){cnt++;if (cnt>k)return false;}else{cnt=1; }}return true;
}
int main()
{cin>>n>>k;fun(n,"");int ans=0;for (auto i:a){//cout<<i<<endl;//检查每个字符串是否满足if (check(i))ans++;}cout<<ans;
}