P2246 SAC#1 - Hello World(升级版)题解

P2246 SAC#1 - Hello World(升级版)题解

大致意思:

就是在一串字母中找出 HelloWorld子序列出现的次数。

大致思路:

  • 暴力,跟据每个字母的位置及相同字母的位置,进行枚举和判断,时间 O ( n ) O (n) O(n)

  • 动态规划,因为题目提供的模板串长度比较小,所以我们可以将它存入数组,一位一位枚举。而我们知道因为是子序列,前面的情况也要包含进去,所以第 i i i 项需要加上 i − 1 i - 1 i1 项,因此得出公式 d p i = d p i + d p i − 1 dp_{i} = dp_{i} + dp_{i - 1} dpi=dpi+dpi1,时间复杂度依然为 O ( n ) O (n) O(n)

这道题我选择了第二种方法来做。

代码实现:

#include<bits/stdc++.h>
using namespace std;
int dp[20];
char s,c[20]={"helloworld"};
const long long mod=1000000007;
int main(){
    dp[0]=1;
	while(1){
		s=getchar();
		if(s==EOF){
			cout<<dp[10]<<endl;
			return 0;
		}
		char k=s+32;
		for(int i=9;i>=0;i--){
			if(k==c[i]||s==c[i]){
				dp[i+1]=(dp[i]+dp[i+1])%mod;
			}
		}
	}
	return 0;
}

这样这道题就完成啦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值