京东笔试8-27号 最后一题(漂亮数)

输入一个n
输出长度为n的,只包括小写字母的,至少有两个red的字符串的数量。
解决方案:用总的字符串数量 减去 不包括一个red的,再减去包括一个red的字符串的数量
dp[i][j]表示前i个字符,其中第i个字符已经匹配到red的第j位了的字符串个数,例如dp[6][2]表示前6个字符,最后已经匹配到re了的字符串个数,即以re结尾的字符串个数。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
ll dp[N][4];
void init(int n){
	dp[0][0] = 1;
	for(int i = 1; i <= n; i ++){
		dp[i][0] = (dp[i - 1][0] * 25 % mod + dp[i - 1][1] * 24 % mod + dp[i - 1][2] * 24 % mod) % mod;
		dp[i][1] = (dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2]) % mod;
		dp[i][2] = dp[i - 1][1];
	}
}
int main()
{
	int n;
	cin >> n;
	ll ans = 1;
	for(int i = 1; i <= n; i ++){
		ans = ans * 26 % mod;
	}
	init(n);
	ans = (ans - (dp[n][0] + dp[n][1] + dp[n][2]) % mod + mod) % mod;
	for(int i = 1; i <= n - 2; i ++){
		ll left = (dp[i - 1][0] + dp[i - 1][1] + dp[i - 1][2]) % mod;
		ll right = (dp[n - i - 2][0] + dp[n - i - 2][1] + dp[n - i - 2][2]) % mod;
		ans = (ans - left * right % mod + mod) % mod;
	}
	cout << ans << endl;
	return 0;
}


#京东笔试##dp##笔试##京东#
全部评论
dp的ij没太看明白,可以举个例子吗大佬
点赞 回复 分享
发布于 2022-08-28 10:49 浙江

相关推荐

不要停下啊:大二打开牛客,你有机会开卷了,卷起来,去找课程学习,在牛客上看看大家面试笔试都需要会什么,岗位有什么需求就去学什么,努力的人就一定会有收获,这句话从来都经得起考验,像我现在大三了啥也不会,被迫强行考研,炼狱难度开局,啥也不会,找工作没希望了,考研有丝丝机会
点赞 评论 收藏
分享
白火同学:只是实习的话,你这份简历应该也差不多了。真要优化的话,因为面实习的话,没有开发经验,面试更重视技术栈水平。 1、重视JavaSE的基础吧,集合、泛型算是比较基础的基础,多线程、反射、JVM内存模型才是基础; 2、技术栈写到具体的点,比如Elasticsearch的使用写到某个点,限制面试官自由发挥,防止问了相关问题最后又答不上,如果真没把握建议不写,降低面试官的心理预期; 3、技术栈不要重复,比如技术栈第二条和第八条可以合并改为“熟悉Redis中间件,包括基本数据结构、缓存策略、持久化机制,了解缓存三剑客及其解决方案,并有相关项目经验。”; 4、项目指标量化,比如“达到xx秒的响应速度”(不过这个就有点偏校招社招的要求了,实习简历不写也无伤大雅)。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
今天 11:30
点赞 评论 收藏
分享
评论
6
13
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务