网易编程题(二)
来源:互联网 发布:淘宝淘词助手官网 编辑:程序博客网 时间:2024/06/17 18:06
BAACAACCBAAA 连续子串"CBA"中包含了'A','B','C'各一个,所以是纯净的字符串
AABBCCAABB 不存在一个长度为3的连续子串包含'A','B','C',所以是暗黑的字符串
你的任务就是计算出长度为n的字符串(只包含'A'、'B'和'C'),有多少个是暗黑的字符串。
分析:
动态规划思想:
要知道长度为n的字符串的黑暗字符串数 f(n),联想到在长度为n-1的黑暗字符串后面追加字母 ‘A’ 'B' 'C',考虑到n-1长度的暗黑字符串其尾部三位字符,肯定不全含A B C,所以最后两位字符可相同 也可不同,分两种情况:
f(n) = s(n) + d(n) ,s(n)表示n长度黑暗串后两位相同的黑暗字符串数,d(n)表示后两位不同时的情况。
(1)假设n-1长度有s(n-1)个后两位相同,则可以构造处 3*s(n-1)
比如:BAA 可构造出 BAAA BAAB BAAC
(2)假设n-1长度有d(n-1)个后两位相同,则可以构造处 2*d(n-1)
比如:BAB 可构造出 BABA BABB
所以 f(n) = s(n) + d(n) =3s(n-1) + 2d(n-1) =2f(n-1) + s(n-1),有个s(n-1)未消掉,联想到找f(n-2)和s(n-1)的关系
注意到(1)中 构造出来的有1/3后两位相同,(2)中有1/2相同
所以 s(n) = s(n-1) + d(n-1) d(n) = 2s(n-1) + d(n-1)
所以 s(n) = f(n-1)
所以 s(n-1) = f(n-2)
得到: f(n)=2f(n-1) + f(n-2).
代码:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
long long d0 = 3;
long d1 = 9;
long long temp;
if(n == 1)
cout<<d0;
else
if(n == 2)
cout<<d1;
else
{
for(int i=3;i<=n;i++)
{
temp =d1;
d1 = 2*d1 + d0;
d0 = temp;
}
cout<<d1;
}
}
- 网易编程题(二)
- 分享java编程题(二)(网易笔试)
- 网易游戏技术岗在线编程题(二)
- 网易编程题二,优雅的点(计数)
- 网易编程笔试题(二):地牢逃脱
- 2018网易内推笔试编程题(二)
- 网易笔试编程题-不要二
- 网易编程题解析(二)
- 网易2017内推笔试编程题合集(二)(第三题) 不要二
- 网易编程题(合唱团)
- 笔试编程题(网易)
- 网易2017内推笔试编程题合集(二)第一题 混合颜料
- 网易2017内推笔试编程题合集(二)第二题 幸运的袋子
- 【牛客网】网易2017内推笔试编程题合集(二)
- 矩阵-不要二(网易题)
- 合唱团(2016网易编程题)
- 【Python】 网易笔试编程题(集合)
- 网易编程笔试题(一):合唱团
- Linux实验—搭建路由环境
- Android常用开源框架
- 思维会骗人,程序不骗人。
- mysql的数据导入和导出
- JAVA 请求http接口返回json数据解析
- 网易编程题(二)
- 微信小程序----组件之slider
- useDelimiter指定多个分隔符
- 关于Linux下安装Oracle时报错:out of memory的问题分析说明
- 算法 第四版 1.4.20 双调查找
- 实现验证码
- 一篇发表于CVPR的去雨论文
- vue开发app项目实例
- iOS之键路径keyPath