题目描述 输入一个整数n,输出仅由0和1组成的长度为n的字符串,并且其中不含有三个连续的相同子串。仅需输出方案总数。
时间: 2023-03-31 13:01:04 浏览: 151
你好,根据你的要求,我可以回答你的问题。这是一个计数问题,可以使用动态规划来解决。设f[i][]表示长度为i,以结尾的合法字符串个数,f[i][1]表示长度为i,以1结尾的合法字符串个数。则有以下状态转移方程:
f[i][] = f[i-1][] + f[i-2][] + f[i-2][1]
f[i][1] = f[i-1][1] + f[i-2][]
初始状态为f[1][]=1, f[1][1]=1, f[2][]=2, f[2][1]=1。最终答案为f[n][]+f[n][1]。希望能够帮到你。
相关问题
题目描述 输入一个整数,按输出样例方式打印一个用*组成的直角三角形 输入 5 输出 * ** *** **** *****
这是一个Python程序,可以实现输入一个整数n,按照输出样例方式打印一个用*组成的直角三角形。具体实现方法如下:
```python
n=int(input())
t=2*n-1
for i in range(1,n+1):
a="*"*(2*i-1)
print(a.center(t))
```
输入5后,程序会输出如下结果:
```
*
***
*****
*******
*********
```
程序的实现方法是通过循环控制语句和字符串格式化输出实现的。首先,输入一个整数n,计算出直角三角形的底边长度t=2*n-1。然后,通过for循环控制语句,从1到n遍历每一行,每一行的星号数量为2*i-1,通过字符串乘法运算符*生成一个长度为2*i-1的星号字符串a。最后,通过字符串居中对齐的方法,将星号字符串a居中输出,输出的总长度为t。
输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
暴力解法:
直接使用系统自带的函数将十六进制转换为十进制,再将十进制转换为二进制。代码如下:
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) {
string s;
cin >> s;
int num = stoi(s, 0, 16);
bitset<32> bin(num);
cout << bin.to_string().substr(bin.to_string().find('1')) << endl;
}
return 0;
}
其中,stoi函数可以将字符串转换为整数,第二个参数表示字符串的起始位置,第三个参数表示转换的进制。bitset可以将整数转换为二进制,并且可以指定位数,这里我们指定为32位。最后将二进制字符串截取掉前面的0输出即可。
优化解法:
由于题目要求将十六进制转换为二进制,我们可以直接将十六进制的每一位转换为对应的四位二进制,组成一个二进制字符串。代码如下:
#include <iostream>
#include <string>
using namespace std;
string hex2bin(char c) {
switch(c) {
case '0': return "0000";
case '1': return "0001";
case '2': return "0010";
case '3': return "0011";
case '4': return "0100";
case '5': return "0101";
case '6': return "0110";
case '7': return "0111";
case '8': return "1000";
case '9': return "1001";
case 'A': return "1010";
case 'B': return "1011";
case 'C': return "1100";
case 'D': return "1101";
case 'E': return "1110";
case 'F': return "1111";
}
return "";
}
int main() {
int n;
cin >> n;
for(int i=0; i<n; i++) {
string s;
cin >> s;
string bin;
for(int j=0; j<s.length(); j++) {
bin += hex2bin(s[j]);
}
cout << bin.substr(bin.find('1')) << endl;
}
return 0;
}
这里我们定义了一个函数hex2bin,将十六进制的每个字符转换为对应的四位二进制字符串。然后遍历输入的每个十六进制数的每一位,将其转换为对应的二进制字符串,最后将所有二进制字符串拼接起来即可。注意要将二进制字符串截取掉前面的0输出。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)