题目链接:

https://www.luogu.com.cn/problem/P2246

题目大意:

在一篇文章(包含英文字母(大小写均有)、数字、和空白字符(制表/空格/回车))中寻找“helloworld”(任意一个字母的大小写都行)的子序列出现了多少次,输出结果对1000000007(10^9+7)的余数

思路:

字符串 DP ,构建一个二维 DP 数组,dp[i][j] 的 i 表示文章中的第几个字符,j 表示寻找的字符串的第几个字符,当字符串中的字符和文章中的字符相同时,即找到符合条件的字符, dp[i][j] = dp[i - 1][j] + dp[i - 1][j - 1],因为字符串中的每个字符不会对后面的结果产生影响,所以 DP 方程可以优化成一维的, 由于字符串中有重复的字符,所以比较时应该从后往前

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int mod = 1e9 + 7;
char c, s[20] = "!helloworld";
LL dp[20];
int main(){
	dp[0] = 1;
	while ((c = getchar()) != EOF)
		for (int i = 10; i >= 1; i--)
			if (c == s[i] || c == s[i] - 32)
				dp[i] = (dp[i] + dp[i - 1]) % mod;
	cout << dp[10] << "\n";
	return 0;
}
posted on 2021-10-30 11:26  Hamine  阅读(171)  评论(0编辑  收藏  举报